Android倒計時電子鐘的實現(下篇),android下篇
本篇繼續上篇未完成的部分,這篇文章會實現動態效果
在程式中先給定一個截止時間:
2014-12-20 00:00:00
然後計算當期時間和截止時間相差的時間
private long getCurrentShowTimeSeconds() {Date curTime = new Date(); long ret = endDate.getTime() - curTime.getTime(); ret =Math.round( ret/1000 ); return ret >= 0 ? ret : 0;}
然後線上程中添加迴圈,並間隔50ms重新整理一次。
具體代碼如下
/** * CountDownView.java * Copyright(C) 2014 * creator:cuiran 2014-12-19 下午2:18:59 */package com.cayden.countdown.view;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import com.cayden.countdown.Constants;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;/** * 倒計時View * @author cuiran * @version 1.0.0 */public class CountDownView extends SurfaceView implements Runnable, Callback,Constants {private static final String TAG="CountDownView";private SurfaceHolder mHolder; //用於控制SurfaceViewprivate Canvas mCanvas; //聲明畫布private Paint mPaint; //聲明畫筆 private Thread mThread; //聲明一個線程 private static final int RADIUS=10;//聲明小球半徑 private static final int MARGIN_TOP = 60; private static final int MARGIN_LEFT = 30; private ArrayList<int[][]> list=new ArrayList<int[][]>(); private static final String END="2014-12-20 00:00:00"; private Date endDate=null; private long curShowTimeSeconds=0;public CountDownView(Context context) {super(context); mHolder = this.getHolder(); //獲得SurfaceHolder對象 mHolder.addCallback(this); //添加狀態監聽 mPaint = new Paint(); //建立一個畫筆對象 mPaint.setColor(Color.BLUE); //設定畫筆的顏色}private long getCurrentShowTimeSeconds() {Date curTime = new Date(); long ret = endDate.getTime() - curTime.getTime(); ret =Math.round( ret/1000 ); return ret >= 0 ? ret : 0;}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}@Overridepublic void surfaceCreated(SurfaceHolder arg0) { mThread = new Thread(this); //建立線程對象 mThread.start();}@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {}@SuppressLint("SimpleDateFormat")public Date strToDateLong(String strDate){if("".equals(strDate)||null==strDate){return null;}SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");ParsePosition pos = new ParsePosition(0);Date strtodate = formatter.parse(strDate, pos);return strtodate;}@Overridepublic void run() {try{ list.add(data0); list.add(data1); list.add(data2); list.add(data3); list.add(data4); list.add(data5); list.add(data6); list.add(data7); list.add(data8); list.add(data9); list.add(data10); endDate=strToDateLong(END); while(true){ curShowTimeSeconds=getCurrentShowTimeSeconds(); mDraw(); Thread.sleep(50); } }catch(Exception e){Log.e(TAG,"run error",e);}}/** * 自訂繪圖方法 * 2014-12-19 下午2:22:45 * */public void mDraw() { mCanvas = mHolder.lockCanvas(); //獲得畫布對象,開始對畫布畫畫 mCanvas.drawColor(Color.BLACK); //設定畫布顏色為黑色 canvas(mCanvas); mHolder.unlockCanvasAndPost(mCanvas); //把畫布顯示在螢幕上}public void canvas(Canvas mCanvas) {//畫圓,(x軸,y軸,半徑,畫筆) int hours=(int)curShowTimeSeconds / 3600; int minutes=(int)(curShowTimeSeconds - hours * 3600)/60 ; int seconds=(int)curShowTimeSeconds % 60; canvasDigit( MARGIN_LEFT , MARGIN_TOP , hours/10 , mCanvas ); canvasDigit( MARGIN_LEFT + 15*(RADIUS+1) , MARGIN_TOP , hours%10 , mCanvas ); canvasDigit( MARGIN_LEFT + 30*(RADIUS + 1) , MARGIN_TOP , 10 , mCanvas ); canvasDigit( MARGIN_LEFT + 39*(RADIUS+1) , MARGIN_TOP , minutes/10 , mCanvas); canvasDigit( MARGIN_LEFT + 54*(RADIUS+1) , MARGIN_TOP , minutes%10 , mCanvas); canvasDigit( MARGIN_LEFT + 69*(RADIUS+1) , MARGIN_TOP , 10 , mCanvas); canvasDigit( MARGIN_LEFT + 78*(RADIUS+1) , MARGIN_TOP , seconds/10 , mCanvas); canvasDigit( MARGIN_LEFT + 93*(RADIUS+1) , MARGIN_TOP , seconds%10 , mCanvas);}public void canvasDigit(int x,int y,int num,Canvas mCanvas) {int [][] data=list.get(num);for(int i=0;i<data.length;i++){for(int j=0;j<data[i].length;j++){if(data[i][j]==1){mCanvas.drawCircle(x + j*2*(RADIUS+1)+(RADIUS+1), y + i*2*(RADIUS+1)+(RADIUS+1), RADIUS, mPaint); }}}}}
需要詳細代碼可以訪問 具體最佳化部分暫時還沒有處理。
github地址:https://github.com/cayden/CountDown