打开金山词霸,当加载下一页或者切换页面时,数据没有立即加载出来,会出现一个LoadingView
一起看看效果:
分析一下效果图,关键的技术点如下:
1.绘制除出9个圆点(圆点的个数可以自己定义)
2.颜色的变化是逐级发生变化.
画圆点的方法:
public void drawCircle (float cx, float cy, float radius, Paint paint)
cx 小圆点x坐标
cy 小圆点y坐标
radius 小圆点半径
paint 画笔
每个小圆所占据的角度
angle = (float) (2 * Math.PI / count);
每个小圆点的圆心坐标
x = getWidth() / 2 + radius * Math.cos(i * angle)
y = getWidth() / 2 - radius * Math.sin(i * angle)
i 的值这里是1~9
- 1
- 2
- 3
- 4
- 5
2.颜色逐级变化
颜色的色值是由32位2进制表示,因此我们可以通过位移拿到每隔8位的色值,将颜色拆分出来,通过动态的的给fraction 赋值,达到颜色渐变的效果.
public class ColorUtil {
// 成新的颜色值
public static int getNewColorByStartEndColor(Context context, float fraction, int startValue, int endValue) {
return evaluate(fraction, startValue, endValue);
}
/**
* 成新的颜色值
*
* @param fraction 颜色取值的级别 (0.0f ~ 1.0f)
* @param startValue 开始显示的颜色
* @param endValue 结束显示的颜色
* @return 返回生成新的颜色值
*/
public static int evaluate(float fraction, int startValue, int endValue) {
int startA = (startValue >> 24) & 0xff;
int startR = (startValue >> 16) & 0xff;
int startG = (startValue >> 8) & 0xff;
int startB = startValue & 0xff;
int endA = (endValue >> 24) & 0xff;
int endR = (endValue >> 16) & 0xff;
int endG = (endValue >> 8) & 0xff;
int endB = endValue & 0xff;
return ((startA + (int) (fraction * (endA - startA))) << 24) |
((startR + (int) (fraction * (endR - startR))) << 16) |
((startG + (int) (fraction * (endG - startG))) << 8) |
((startB + (int) (fraction * (endB - startB))));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
整体代码:
package com.iyuba.myapplication.View;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import com.iyuba.myapplication.ColorUtil;
import com.iyuba.myapplication.R;
/**
* 作者:mingyu on 16-6-16 09:33
* <p/>
* 邮箱:Howard9891@163.com
*/
public class LoadingView extends View {
private int count = 9;
private Paint paint;
private Context mContext;
int j = 0;
private float angle;
private int startColor = Color.BLUE;
private int endColor = Color.TRANSPARENT;
public LoadingView(Context context) {
this(context, null);
}
public LoadingView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
TypedArray typedArray =context.getTheme().obtainStyledAttributes(attrs,R.styleable.loadView,defStyleAttr,0);
int n = typedArray.getIndexCount();
for(int i=0;i<n;i++){
int attr =typedArray.getIndex(i);
switch (attr){
case R.styleable.loadView_startColor:
startColor = typedArray.getColor(attr,Color.BLUE);
break;
case R.styleable.loadView_endColor:
endColor = typedArray.getColor(attr,Color.TRANSPARENT);
break;
default:
break;
}
}
typedArray.recycle();
init();
}
private void init() {
angle = (float) (2 * Math.PI / count);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
//小圆半径
int dot_radius = 4;
//大圆半径
int radius = getWidth() / 2 - dot_radius;
for (int i = 0; i < count; i++) {
paint.setColor(ColorUtil.getNewColorByStartEndColor(mContext, j * 1.0f / count,startColor,endColor));
canvas.drawCircle((float) (getWidth() / 2 + radius * Math.cos(i * angle)), (float) (getWidth() / 2 - radius * Math.sin(i * angle)), dot_radius, paint);
j++;
j =j%count;
}
//同一个位置的圆点,下次绘制不同的颜色 j++
j++;
handler.sendEmptyMessageDelayed(0,100);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
invalidate();
}
};
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
相关推荐
【金山词霸自动添加自定义词典小工具】 在IT行业中,翻译软件是必不可少的工具,尤其是对于程序员和英语学习者来说。金山词霸作为一款知名的翻译应用,它提供了丰富的词汇和多样的功能,帮助用户高效地进行翻译工作...
仿金山词霸界面,仿金山词霸界面,仿金山词霸界面
【标题】:“仿金山词霸2011界面”指的是开发者或设计师为了重现金山词霸2011版本的用户界面而进行的软件设计工作。金山词霸是一款知名的英语学习软件,其界面设计简洁易用,深受用户喜爱。在软件开发中,"仿制界面...
【标题】"仿金山词霸界面"所涉及的知识点主要集中在软件开发领域,特别是使用VC++(Microsoft Visual C++)进行用户界面设计。金山词霸是一款知名的英语学习软件,其界面设计简洁、功能强大,是许多开发者学习和模仿...
"仿金山词霸界面的控件"是一个专为创建类似金山词霸应用界面的开发工具,它提供了各种组件和功能,使得开发者能够快速构建出与金山词霸相似的交互界面。金山词霸是一款著名的英语学习软件,以其清晰、直观的界面和...
6. **自定义资源**:描述中提到只能使用程序内的界面图片,这意味着可能需要自己制作或找到与金山词霸风格相匹配的图像资源。这包括背景图、按钮样式、分割线等,确保整个界面风格的一致性。 7. **技术实现**:实现...
"仿金山词霸界面的vc代码"是一个很好的学习资源,它可以帮助初学者理解MFC(Microsoft Foundation Classes)库,以及如何利用它来创建用户友好的图形用户界面(GUI)。 首先,VC++是微软开发的一种集成开发环境...
【标题】"仿金山词霸界面的VC程序"是一个基于Microsoft Visual C++(简称VC)开发的项目,其目标是创建一个与知名英语学习软件金山词霸类似的用户界面。这样的项目对于想要提升界面设计能力,尤其是对VC编程有一定...
【标题】"仿金山词霸界面.rar"是一个与编程相关的资源,主要涉及C++和VC++编程语言,以及用户界面设计。这个压缩包包含了实现一个类似金山词霸软件界面的源代码,它可能是为了教学、学习或者个人项目而创建的。 在...
在本文中,我们将深入探讨如何使用Visual C++(简称VC)来实现一个仿金山词霸界面的项目。金山词霸是一款知名的英语学习软件,它的用户界面简洁、功能强大,深受用户喜爱。通过仿制其界面,我们可以学习到VC界面编程...
【标题】"仿金山词霸界面[MFC]"的实现是一个基于Microsoft Foundation Class (MFC) 库的应用程序开发项目,旨在创建一个与金山词霸用户界面相似的软件。MFC 是微软提供的一套面向对象的类库,它使得在Windows平台上...
"仿金山词霸界面源码"这个标题揭示了我们关注的重点是关于一个软件界面的设计,它是基于金山词霸的样式模仿而来的。金山词霸是一款知名的中文电子词典,以其丰富的词汇量、多语言翻译功能以及用户友好的界面而广受...
"仿金山词霸"这个项目旨在通过美化界面,为用户提供更舒适的交互体验。金山词霸是一款知名的英语学习软件,其界面设计简洁而高效,因此模仿它的界面风格可以作为提升自己应用品质的一种策略。 首先,我们要理解...
【VC++制作仿金山词霸界面程序】 在IT领域,编程语言VC++(Visual C++)是Microsoft开发的一款强大的Windows应用程序开发工具,它基于C++语言,并提供了丰富的库支持,如MFC(Microsoft Foundation Classes),使得...
总的来说,"swing做的仿金山词霸界面"是一个很好的学习资源,它可以帮助Java开发者提升在Swing上的GUI编程能力,了解如何构建专业级别的桌面应用界面,并掌握组件使用、布局管理、事件处理和界面美化等方面的知识。...
【标题】"仿金山词霸"的项目是一个利用C#编程语言开发的应用程序,旨在实现与金山词霸类似的英语学习和翻译功能。金山词霸是一款知名的词汇查询工具,以其丰富的词库、便捷的查词方式以及多样的学习功能受到用户喜爱...