【问题标题】:Android Chronometer resume functionAndroid Chronometer 恢复功能
【发布时间】:2013-10-05 05:21:02
【问题描述】:

我正在尝试使用 Chronometer 在我的 Android 应用中创建一个恢复按钮。到目前为止,我有这个恢复方法的代码 sn-p:

private long pauseResume() {

    long timeWhenStopped = chronometer.getBase() - SystemClock.elapsedRealtime();

    return timeWhenStopped;

}

这是恢复按钮的代码:

 public void onClick(View v) {
      switch(v.getId()) {

          ...

          case R.id.resume_button:                
              chronometer.setBase(SystemClock.elapsedRealtime() + pauseResume());
              chronometer.start();    
              break;

      }
}

问题:例如,当我在 00:05 暂停计时器,然后在 10 秒后按下恢复按钮时,计时器将在 00:15 恢复计数。

我希望它再次从 00:05 开始,而不是 00:15,因为它是一个“恢复”功能。

我很高兴你能提供帮助。谢谢。

【问题讨论】:

    标签: android chronometer


    【解决方案1】:

    有点晚了,但它可能会帮助其他人。我认为这是解决您问题的方法。

    启动/恢复计时器:

    private void chronoStart()
    {
        // on first start
        if ( mLastStopTime == 0 )
            mChronometer.setBase( SystemClock.elapsedRealtime() );
        // on resume after pause
        else
        {
            long intervalOnPause = (SystemClock.elapsedRealtime() - mLastStopTime);
            mChronometer.setBase( mChronometer.getBase() + intervalOnPause );
        }
    
        mChronometer.start();
    }
    

    暂停计时器:

    private void chronoPause()
    {
        mChronometer.stop();
    
        mLastStopTime = SystemClock.elapsedRealtime();
    }
    

    您需要记住上一次计时器停止时间

    在恢复时,您计算上次停止时间和新开始时间之间的时间。当您有这个间隔时,您只需将该间隔添加到您的计时器基准时间(您“移动”原始开始时间)。

    希望这会有所帮助;)

    【讨论】:

      【解决方案2】:

      这是一个 kotlin 版本:

      private var chronometerPausedTime: Long = 0
      
      // to start the chronometer with 00:00
      private fun Chronometer.startFromZero() {
          base = SystemClock.elapsedRealtime()
          start()
      }
      
      private fun Chronometer.pause() {
          chronometerPausedTime = SystemClock.elapsedRealtime() - this.base
          stop()
      }
      
      private fun Chronometer.resume() {
          base = SystemClock.elapsedRealtime() - chronometerPausedTime
          chronometerPausedTime = 0
          start()
      }
      

      使用:

      binding.chronometer.startFromZero()
      
      //pause
      binding.chronometer.pause()
      
      //resume
      binding.chronometer.resume()
      

      【讨论】:

        【解决方案3】:

        Chronometer 用于实现一个简单的计时器。你可以在elapsedRealtime() 时基中给它一个开始时间,它会从那个开始计数,或者如果你不给它一个基准时间,它会使用这个时间你打电话给start()

        long timeWhenStopped = 0;
        

        当你像这样停止计时器时更新变量的值:

        timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
        mChronometer.stop();
        

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

        mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
        mChronometer.start();
        

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

        mChronometer.setBase(SystemClock.elapsedRealtime());
        timeWhenStopped = 0;
        

        【讨论】:

        • 感谢您的回复。但它做同样的事情。
        【解决方案4】:

        希望这会有所帮助...

        我们需要一个成员变量来保存计时器暂停时的时间。假设是“timeWhenChronometerIsPaused”

        var timeWhenChronometerIsPaused:Long = 0
        

        要启动计时器,请将基准设置为 elaspedRealTime

        fun startChronometer(){
            chronometer.base = SystemClock.elapsedRealtime()
            chronometer.start()
        }
        

        当计时器暂停时,将时间保存在 timeWhenChronometerIsPaused 变量中

        fun pauseChronometer(){
            timeWhenChronometerIsPaused = SystemClock.elapsedRealtime() - chronometer.getBase()
            chronometer.stop()
        }
        

        要恢复计时器,请将基准设置为当前时间和 timeWhenChronometerIsPaused 的差,并将 timeWhenChronometerIsPaused 重置为 0

        fun resumeChronometer(){
            chronometer.base = SystemClock.elapsedRealtime() - timeWhenChronometerIsPaused
            timeWhenChronometerIsPaused = 0
        }
        

        最后,当需要计算经过的时间时,如果它的值不为零,则使用“timeWhenChronometerIsPaused”,否则使用 (SystemClock.elapsedRealtime() - chronometer.base)

        fun getElapsedTime(): String {
        
            val elapsedMillis: Long = if (timeWhenChronometerIsPaused > 0)
                timeWhenChronometerIsPaused
            else
                SystemClock.elapsedRealtime() - chronometer.base
        
            val hours = (elapsedMillis / 3600000).toInt()
            val minutes = (elapsedMillis - hours * 3600000).toInt() / 60000
            val seconds = (elapsedMillis - hours * 3600000 - minutes * 60000).toInt() / 1000
            val millis = (elapsedMillis - hours * 3600000 - minutes * 60000 - seconds * 1000).toInt()
        
            return "$hours:$minutes:$seconds:$millis"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-05
          • 2022-01-17
          • 2016-07-11
          相关资源
          最近更新 更多