最近做了個小實驗--一個小的計數秒表,實現開始計時,暫停計時,重置的功能。界面如下
界面過於簡單,這里就飄過。
制作這個秒表主要用到Chronometer類的start()函數,stop()函數,setBase()函數。
查了下源碼,這個Chronometer的原理就是先設置一個mBase變量,在類被創建時調用init函數將系統啟動后所用掉的時間賦給mBase。源碼如下
而Chronometer控件顯示的時間就是 : 系統啟動后所用掉的時間 - mBase
當你想讓秒表開始計時就調用start函數,這是Chronometer就會自己刷新時間。
而想暫停就調用stop函數,問題就是一個stop函數,這個stop函數只是停止Chronometer刷新時間,而系統的時間還是在繼續計時的。
當你再次調用start函數時,刷新的時間就不是你調用stop函數那一刻的時間,而是從你創建類開始所經過的時間。
而如果想要實現繼續功能就需要費電功夫了。
我的實現方法就是,在按下stop時就把當前系統的時間保存起來,當按下開始時重新設置mBase變量,從而使當前顯示時間不變並繼續計時。
具體代碼如下:
switch (v.getId()){ case R.id.btn_start: if(!flag){ flag = !flag; if(mRecordTime != 0){ Chron.setBase(Chron.getBase() + (SystemClock.elapsedRealtime() - mRecordTime)); }else{ Chron.setBase(SystemClock.elapsedRealtime()); } Chron.start(); } break; case R.id.btn_stop: if(flag){ flag = !flag; Chron.stop(); mRecordTime = SystemClock.elapsedRealtime(); } break; case R.id.btn_reset: Chron.stop(); Chron.setBase(SystemClock.elapsedRealtime()); mRecordTime = 0; flag = false; break; default: break; }
同時還定義了一個boolean的變量,防止因為亂按而使得時間出現錯亂。
這次的代碼過於簡單就不貼源碼了。-_-#