Android版简历(四)
涉及技术
第一步:继承自定义控件
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居然两次提到了这款应用)。
真·结尾 + 扯淡
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。