最近做了个小实验--一个小的计数秒表,实现开始计时,暂停计时,重置的功能。界面如下
界面过于简单,这里就飘过。
制作这个秒表主要用到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的变量,防止因为乱按而使得时间出现错乱。
这次的代码过于简单就不贴源码了。-_-#