最近经常会被问到自定义控件方向的问题,今天抽空做了一个简单的demo。简单仿照火箭闹钟首页的动画。就是动态的画一个圆形,这个和当前时间的秒值绑定。具体的实现方式就是不停的重绘,实现动画的效果。下面直接看代码
在onResume中获取当前时间的秒值赋值给全局的一个变量值
//在这里算出i的值,也就是当前时间的秒值,因为要延迟50ms绘制一次,所以1分钟是60s是6000ms,需要绘制1200次。 所以这里需要乘以20 i = Calendar.getInstance().get(Calendar.SECOND)*20;
handler.sendEmptyMessageDelayed(i++, 0);
接下来看handler的处理
pro = 1200; Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { testConvas.setProgress(msg.what); if (i <= pro) {//如果还没有到达一分钟的时间,继续发送消息,每次延迟50ms,实现动画效果 handler.sendEmptyMessageDelayed(i++, 50); }else {//如果大于pro之后,立即将i置为0,重新开始绘制 i = 0; handler.sendEmptyMessageDelayed(i++, 0); } } };以上是activity的处理,接下来看绘制的方法
供activity调用的,将自增的i值发送到这里
public void setProgress(int progress) { this.progress = progress; invalidate();//重绘的方法 }
绘制圆弧
if (progress <= pro) { Paint paint1 = initPaint(); paint1.setColor(color); canvas.drawArc(initRecF(), -90, ((float) progress / max) * 360, false, paint1); // 画圆弧,第一个是圆弧所在的椭圆对象,第二个参数为:起始角度,第三个为跨的角度, 第四个为true的时候是实心,false的时候为空心 }
就这么简单,一个和时间绑定的圆弧的绘制实现了。一圈正好是1分钟的时间哦。只是一个简单的例子,后期会补充修改一下样式,使效果更完美