自定義view實現(xiàn)簡單的計時器

自定義View學(xué)習(xí)小記

@Alu

先貼代碼

public class CountView extends View {
private Paint mPaint;
private int millisecond;
private int hour;
private int minute;
private int second;
private Rect mBounds;
private Context context;
private boolean isRunning = false;
private Timer timer;
private StringBuffer stringBuffer;
private MyTask myTask;

public CountView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
    mBounds = new Rect();
    mPaint = new Paint();
    stringBuffer = new StringBuffer();
    stringBuffer.append("00:00:00:00");

}
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            if (isRunning) {
                timer.cancel();
                timer.purge();
                timer = null;
                myTask = null;
                System.gc();
            } else {
                timer = new Timer();
                myTask = new MyTask();
                timer.schedule(myTask, 0, 10);
            }
            isRunning = !isRunning;
            break;
    }
    return false;
}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mPaint.setColor(ContextCompat.getColor(context, R.color.colorPrimary));
    canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
    mPaint.setColor(Color.WHITE);
    mPaint.setTextSize(60);
    String text = stringBuffer.toString();
    mPaint.getTextBounds(text, 0, text.length(), mBounds);
    float textWidth = mBounds.width();
    float textHeight = mBounds.height();
    canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2 + textHeight / 2, mPaint);

}

private class MyTask extends TimerTask {

    @Override
    public void run() {
        stringBuffer.delete(0, stringBuffer.length());
        millisecond++;
        if (millisecond > 99) {
            millisecond = 0;
            second++;
        }
        if (second > 59) {
            second = 0;
            minute++;
        }

        if (minute > 59) {
            minute = 0;
            hour++;
        }
        if (hour < 10)
            stringBuffer.append(0).append(hour);
        else
            stringBuffer.append(hour);
        stringBuffer.append(":");
        if (minute < 10)
            stringBuffer.append(0).append(minute);
        else
            stringBuffer.append(minute);
        stringBuffer.append(":");
        if (second < 10)
            stringBuffer.append(0).append(second);
        else
            stringBuffer.append(second);
        stringBuffer.append(":");
        if (millisecond < 10)
            stringBuffer.append(0).append(millisecond);
        else
            stringBuffer.append(millisecond);
        handler.sendEmptyMessage(0);
    }

}

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (msg.what == 0) {
            invalidate();
        }
    }
};

}
利用Handler+Timer來控制時間,StringBuffer和很簡單的算法來保存時間帮匾。
用法很簡單直接在布局中引用:

<com.alu.test.okletusgo.myview.view.CountView
    android:layout_width="150dp"
    android:layout_height="50dp"
    android:layout_centerInParent="true" />

稍加改造也可以有其他用途定拟,例如 在抽獎之類的界面使用.

需要注意的:

view的點擊事件里我做了:

timer = new Timer();  
myTask = new MyTask();

原因是個人多次嘗試仙蚜,timerrun方法只會執(zhí)行 TimerTask 類的run();方法一次,所以手動去將之前用過的對象設(shè)置為 null 并調(diào)用 System.gc(); ,企圖回收對象,(感覺很笨之众,希望有人看了指點一下),再重新去設(shè)置一個新的 timer
另外提一下 Viewinvalidate(); 方法需要在主線程執(zhí)行 ,這也是使用了handler的原因蕊爵。

最后:

不求贊著蛙,只求提出問題删铃,讓我改進學(xué)習(xí)。

修改暫停繼續(xù)的操作在 onTouch 的 ACTIONDOWN 情境下 踏堡。原因是對計時器的精準控制就應(yīng)該體現(xiàn)在點下去的瞬間來控制跑秒猎唁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顷蟆,隨后出現(xiàn)的幾起案子诫隅,更是在濱河造成了極大的恐慌腐魂,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逐纬,死亡現(xiàn)場離奇詭異蛔屹,居然都是意外死亡,警方通過查閱死者的電腦和手機豁生,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門兔毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甸箱,你說我怎么就攤上這事眼刃。” “怎么了摇肌?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仪际。 經(jīng)常有香客問我围小,道長,這世上最難降的妖魔是什么树碱? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任肯适,我火速辦了婚禮,結(jié)果婚禮上成榜,老公的妹妹穿的比我還像新娘框舔。我一直安慰自己,他們只是感情好赎婚,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布刘绣。 她就那樣靜靜地躺著,像睡著了一般挣输。 火紅的嫁衣襯著肌膚如雪纬凤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天撩嚼,我揣著相機與錄音停士,去河邊找鬼。 笑死完丽,一個胖子當(dāng)著我的面吹牛恋技,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逻族,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蜻底,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了聘鳞?” 一聲冷哼從身側(cè)響起朱躺,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刁赖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后长搀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宇弛,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年源请,在試婚紗的時候發(fā)現(xiàn)自己被綠了枪芒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡谁尸,死狀恐怖舅踪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情良蛮,我是刑警寧澤抽碌,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站决瞳,受9級特大地震影響货徙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皮胡,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一痴颊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屡贺,春花似錦蠢棱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至量没,卻和暖如春饰豺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背允蜈。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工冤吨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饶套。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓漩蟆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妓蛮。 傳聞我的和親對象是個殘疾皇子怠李,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 主要思路 1.我們需要自定義一個繼承自FrameLayout的布局,利用FrameLayout布-局的特性(在同一...
    ZebraWei閱讀 2,292評論 0 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,273評論 25 707
  • 周五,我一直在說服自己捺癞,只要你想做夷蚊,就一定能做到。但是發(fā)現(xiàn)自己執(zhí)行力太差髓介,是沒有精神惕鼓,還是年齡大了,注意力渙散√拼。現(xiàn)...
    向往的1991閱讀 132評論 0 0
  • 開工一張新的箱歧,有誰知道是什么名號嗎?
    joyyang1221閱讀 220評論 0 2
  • 我們沒有義務(wù)去感同身受別人的故事和感情 生活一膨,就應(yīng)該在不傷害他人的基礎(chǔ)上 讓自己活的舒服
    樹郵閱讀 233評論 0 1