【问题标题】:Android_Chronometer pauseAndroid_Chronometer 暂停
【发布时间】:2011-04-08 12:13:16
【问题描述】:

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

【问题讨论】:

    标签: android chronometer


    【解决方案1】:

    您将需要一个变量来跟踪自 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;
    

    【讨论】:

    • 很好的答案......有很好的描述......!!它应该被接受为答案..@andveand 如果它正在工作..!!
    • 很好的答案,加上很好的解释...... :)
    • 太棒了!像魅力一样工作。
    • 也许我有一种奇怪的思维方式,但 Chronometer 的工作方式似乎真的不合常理。默认情况下,它应该在调用 start() 时从 00:00 开始,并且 stop() 应该按原样停止计时器,并且下一次调用 start 应该恢复时间,并有一个 reset 方法将其重置为 00: 00.我会用你的方法来解决这个问题,但我只是想知道为什么谷歌会这样设计。
    【解决方案2】:

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

    【讨论】:

    • 其他答案肯定是错误的。这应该是最受好评的答案。
    【解决方案3】:

    我为此创建了一个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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多