首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android_Chronometer暂停

Android_Chronometer暂停
EN

Stack Overflow用户
提问于 2011-04-08 20:13:16
回答 3查看 18.2K关注 0票数 42

我想暂停计时器,在我点击按钮后,我想继续计时…我搜索了一下,但找不到与此相关的函数..怎么才能做到呢?

EN

回答 3

Stack Overflow用户

发布于 2011-08-15 20:32:32

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

代码语言:javascript
复制
long timeWhenStopped = 0;

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

代码语言:javascript
复制
timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
mChronometer.stop();

在开始计时之前,我们还将使用此变量来调整计时器:

代码语言:javascript
复制
mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
mChronometer.start();

最后,如果你有办法重置你的计时器,那么你应该记得也重置timeWhenStopped变量。如下所示:

代码语言:javascript
复制
mChronometer.setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
票数 141
EN

Stack Overflow用户

发布于 2016-11-13 12:26:34

另外两个答案是相同的,并且在天文表的显示上工作得很好,但它们有一个缺陷:timeWhenStopped以及getCurrentTime()返回的值都是负值。

这是我的建议,基于这两个答案:

代码语言:javascript
复制
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())之间经过的时间,因此是减法。

票数 16
EN

Stack Overflow用户

发布于 2014-10-20 23:24:09

我为此制作了一个PauseableChronometer类。

代码语言:javascript
复制
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);
    }
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5594877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档