7

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:15ではなく00:05に再度開始したい。

お役に立ててとてもうれしいです。ありがとう。

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

ここに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()
于 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 に答える