Android Chronometer恢复功能

时间:2013-10-05 05:21:02

标签: android chronometer

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

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 个答案:

答案 0 :(得分:8)

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

开始/恢复计时器:

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

您需要记住最后一个计时器停止时间

在恢复时,您可以计算上次停止时间与新开始时间之间的时间。当你有这个间隔时,你只需将时间间隔添加到你的天文台基准时间(你"移动"原始开始时间)。

希望这会有所帮助;)

答案 1 :(得分:0)

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;

答案 2 :(得分:0)

希望这对您有帮助...

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

var timeWhenChronometerIsPaused:Long = 0

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

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

当天文钟暂停时,请及时保存ChronometerIsPaused变量的时间

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

要恢复计时码表,请将基数设置为当前时间与当ChronometerIsPaused时的时间之差,并重置timeChronometerIsPaused时的时间为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"
}

答案 3 :(得分:0)

这是一个 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()