public Skill(Context context, String name, int percent, int styleType) {
super(context);
this.context = context;
switch (styleType) {
case BLUE:
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#004884"), percent);
break;
case GREEN:
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#36B77D"), percent);
break;
case RED:
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#ED1654"), percent);
break;
case PINK:
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#EB9F9F"), percent);
break;
case YELLOW:
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#E2A937"), percent);
break;
}这个init函数是父类Ring的函数。 public Skill(Context context, int id, String name, int percent) {
super(context);
this.id = id;
this.context = context;
if(percent >= 90) {
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#ED1654"), percent);
} else if (percent >= 80) {
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#EB9F9F"), percent);
} else if (percent >= 75) {
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#E2A937"), percent);
} else if (percent >= 65) {
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#36B77D"), percent);
} else {
init(name, Color.WHITE, RING_WIDTH, Color.parseColor("#004884"), percent);
}
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(UI_WIDTH,UI_WIDTH);
this.setLayoutParams(lp);
}在PagerActivity中,解析到xml后可以如下的创建控件: if (skills != null) {
LinearLayout ll = (LinearLayout) skills.findViewById(R.id.skills_layout);
List<Map<String, Object>> skillList = SkillsParser.getSkillsList(context);
for (Map<String, Object> skill : skillList) {
Skill o = new Skill(context, Integer.parseInt((String) skill.get("id")), (String) skill.get("name"),
Integer.parseInt((String) skill.get("point")));
ll.addView(o);
}
}其中构造器有一个id,是为了跳转Activity来服务的,下一步就会知道。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.i("Ring", "Action Up Speed: " + ANIMATE_SPEED);
touched = true;
ringAlpha = START_ALPHA;
translateRadius = START_RADIUS;
invalidate();
}
return true;
}将触摸标志设为true之后,调用invalidate来强制重绘,会调用onDraw,此时onDraw函数应该这样写: @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(touched) {
Paint p = new Paint();
p.setStyle(Paint.Style.FILL);
p.setColor(skillColor);
p.setStrokeWidth(1);
p.setAlpha(ringAlpha);
int w = canvas.getClipBounds().width();//获取高度
int c = w / 2;//计算中心点
int inner = Math.round(c - this.ringWidth - translateRadius); //设置内圆半径
canvas.drawCircle(c,c, inner, p);
translateRadius -= ANIMATE_SPEED;
ringAlpha -= ANIMATE_SPEED * 5;
if(inner >= UI_WIDTH/2 || ringAlpha <= 0) {
touched = false;
Intent toSkill = new Intent(context, SkillActivity.class);
toSkill.putExtra("id", id);
context.startActivity(toSkill);
}
postInvalidateDelayed(20);
}
}我们不停的绘制这个光圈(或者说光圆),直到光圈的透明度变为透明了或者光圈扩散到了看不见的地方。postInvalidateDelayed是为了控制动画播放的速度,降低帧率的。做完了这些,我们自定义控件的动画就完成了。动画虽然是小儿科,但是可以学习到做动画的方法,其实还有很多的方法可以产生自定义控件动画,有兴趣可以查一查,我见过的做的最漂亮的自定义控件和自定义控件动画是Timely,它的数字动画和背景颜色过渡简直看醉了,我就不给链接了,有兴趣的同学可以去百度一下安装看看,不过好像需要Android
4.2+还是4.0+,安装不了的可以看看宣传视频(Google的Android Design居然两次提到了这款应用)。原文:http://blog.csdn.net/xjyzxx/article/details/22059193