Android使用Chronometer实现计时器
不用使用线程搭配Handler,直接使用Chronometer实现计时器,可以开始、暂停、重置计时器。
一、Chronometer是TextView的子类,用法跟一般控件一致,布局很简单直接拖放控件就可以了。
二、使用:
通过按钮点击事件来调用Chronometer的相关方法即可。Chronometer timer
1、开始计时:timer.start()
2、暂停计时:timer.stop()
3、重置计时器:timer.setBase(SystemClock.elapsedRealtime());
但是要注意的是点击暂停按钮后,只是表面上的暂停,实际上后台仍旧在继续计时,这时候点击开始按钮会发现时间的变化。
三、原因:首次运行时timer.start()之后
会默认设置timer.setBase(SystemClock.elapsedRealtime());即设置当前时间起开始计时,计算首次运行的time 与 当前时间差额从而达到及时的效果,暂停或停止之后,time不会变,因此计时器实际仍在继续运行。
四、解决办法:
增加变量 boolean falg 初始值为 false,long stopTime 点击暂停时记录当前时间同时将 falg 置为 true, long base 记录计时器的Base时间(即计时起始时间),当再次点击开始按钮,计算当前时间与stopTime之间的差额为 t ,最后 timer.setBase(base+t);即可实现真正意义上的计时器,完成到这一步了,注意在 重置按钮的点击事件里,将 falg 置为 false , 否则会有bug。
详情见以下代码:
private Button btn_start;
private Button btn_stop;
private Button btn_reset;
private Chronometer timer;
long stopTime;
long base;
private boolean falg = false;
case R.id.btn_start: {
if (falg) {
// 设置开始计时时间
long t = SystemClock.elapsedRealtime() - stopTime;
timer.setBase(base + t);
}
// 开始记时
timer.start();
}
break;
case R.id.btn_stop: {
stopTime = SystemClock.uptimeMillis();
timer.stop();
falg = true;
base = timer.getBase();
}
break;
case R.id.btn_reset: {
timer.setBase(SystemClock.elapsedRealtime());
falg = false;
}
break;
项目下载地址:
http://download.csdn.net/detail/ouyangjiluo/7096461 不需要积分