【发布时间】:2011-04-08 12:13:16
【问题描述】:
我想暂停计时器,点击按钮后我想继续计时器计数...我搜索但找不到与此相关的功能.. 怎么做?
【问题讨论】:
标签: android chronometer
我想暂停计时器,点击按钮后我想继续计时器计数...我搜索但找不到与此相关的功能.. 怎么做?
【问题讨论】:
标签: android chronometer
您将需要一个变量来跟踪自 Chronometer 启动以来经过的时间:
long timeWhenStopped = 0;
当您像这样停止计时器时更新变量的值:
timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
mChronometer.stop();
我们还将在启动计时器之前使用此变量来调整计时器:
mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
mChronometer.start();
最后,如果您有办法重置计时器,那么您应该记得也重置 timeWhenStopped 变量。像这样的:
mChronometer.setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
【讨论】:
另外两个答案是相同的,并且在 Chronometer 的显示屏上运行良好,但它们有一个缺陷:timeWhenStopped,以及getCurrentTime() 返回的值是负数。
这是我的建议,基于这两个答案:
public class PausableChronometer extends Chronometer {
private long timeWhenStopped = 0;
public PausableChronometer(Context context) {
super(context);
}
public PausableChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PausableChronometer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void start() {
setBase(SystemClock.elapsedRealtime() - timeWhenStopped);
super.start();
}
@Override
public void stop() {
super.stop();
timeWhenStopped = SystemClock.elapsedRealtime() - getBase();
}
public void reset() {
stop();
setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
}
public long getCurrentTime() {
return timeWhenStopped;
}
public void setCurrentTime(long time) {
timeWhenStopped = time;
setBase(SystemClock.elapsedRealtime() - timeWhenStopped);
}
}
您必须将SystemClock.elapsedRealtime() 理解为“现在”的指示符。因此,当我们(重新)启动计时器时,我们将设置基数 N 过去的秒数,N 是计时器的当前值(第一次启动时为 0)。
类似地,当停止计时器时,计时器显示的时间是之前设置的基准 (getBase()) 和现在 (SystemClock.elapsedRealtime()) 之间经过的时间,因此是减法。
【讨论】:
我为此创建了一个PauseableChronometer 类。
import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.Chronometer;
public class PausableChronometer extends Chronometer {
private long timeWhenStopped = 0;
public PausableChronometer(Context context) {
super(context);
}
public PausableChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PausableChronometer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void start() {
setBase(SystemClock.elapsedRealtime()+timeWhenStopped);
super.start();
}
@Override
public void stop() {
super.stop();
timeWhenStopped = getBase() - SystemClock.elapsedRealtime();
}
public void reset() {
stop();
setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
}
public long getCurrentTime() {
return timeWhenStopped;
}
public void setCurrentTime(long time) {
timeWhenStopped = time;
setBase(SystemClock.elapsedRealtime()+timeWhenStopped);
}
}
【讨论】: