7

我正在尝试使用 Chronometer 在我的 Android 应用程序中创建一个恢复按钮。到目前为止,我有 resume 方法的代码片段:

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,因为它是一个“恢复”功能。

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

4

4 回答 4

10

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

开始/恢复计时器:

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();
}

你需要记住最后的计时器停止时间

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

希望这可以帮助 ;)

于 2014-08-14T18:26:44.317 回答
2

这是一个科特林版本:

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()
于 2021-08-12T00:53:40.713 回答
1

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;
于 2013-10-05T05:26:50.077 回答
0

希望这可以帮助...

我们需要一个成员变量来保存计时器暂停的时间。假设这是“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"
}
于 2019-11-01T15:16:35.620 回答