最近經常會被問到自定義控件方向的問題,今天抽空做了一個簡單的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分鐘的時間哦。只是一個簡單的例子,後期會補充修改一下樣式,使效果更完美