42

我想暂停计时器,然后单击按钮后我想继续计时器计数...我搜索但找不到与此相关的功能..怎么办?

4

3 回答 3

142

您将需要一个变量来跟踪自 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;
于 2011-08-15T12:32:32.403 回答
16

其他两个答案是相同的,并且在 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()) 之间经过的时间,因此是减法。

于 2016-11-13T04:26:33.607 回答
11

我为此做了一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);
    }
}
于 2014-10-20T15:24:09.353 回答