Android_Chronometer暂停

and*_*and 37 android chronometer

我想暂停计时器,然后在我点击按钮后我想继续发色计数...我搜索但是无法将相关功能与此相关..怎么办呢?

Hen*_*ikS 130

您将需要一个变量来跟踪自计时器启动以来所经过的时间:

long timeWhenStopped = 0;
Run Code Online (Sandbox Code Playgroud)

如下所示停止计时器时更新变量的值:

timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
mChronometer.stop();
Run Code Online (Sandbox Code Playgroud)

我们还将在启动之前使用此变量调整计时器:

mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
mChronometer.start();
Run Code Online (Sandbox Code Playgroud)

最后,如果您有办法重置计时器,那么您应该记得重置timeWhenStopped变量.像这样的东西:

mChronometer.setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
Run Code Online (Sandbox Code Playgroud)

  • 也许我的思维方式很奇怪,但是 Chronometer 的工作方式似乎真的很不合常理。默认情况下,当 start() 被调用时,它应该从 00:00 开始,stop() 应该按原样停止计时器,下一次对 start 的调用应该恢复时间,并有一个重置方法将其重置为 00: 00. 我会用你的方法来解决这个问题,但我只是想知道谷歌为什么这样设计。 (3认同)

BLu*_*NiX 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*sik 8

另外两个答案是相同的,并且在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

你必须理解SystemClock.elapsedRealtime()为"现在"的指标.因此,当我们(重新)启动计时器时,我们将设置N过去的基本秒数,N即计时器的当前值(在第一次启动时为0).类似地,当停止计时器时,计时器显示的时间是先前设定的基数(getBase())和现在(SystemClock.elapsedRealtime())之间经过的时间,因此减法.