42

クロノメーターを一時停止したいのですが、ボタンをクリックした後、クロモメーターのカウントを続行したいです...検索しましたが、これに関連する機能がありませんでした..どうすればいいですか?

4

3 に答える 3

142

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;
于 2011-08-15T12:32:32.403 に答える
16

他の 2 つの答えは同じで、クロノメーターの表示では非常にうまく機能しますが、1 つの欠点があります。 とtimeWhenStoppedによって返される値getCurrentTime()は負です。

これら2つの答えに基づいて、これが私の提案です:

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()「今」の指標として理解する必要があります。したがって、クロノメーターを (再) 開始するときは、タイマーの現在の値 (最初の開始の場合は 0) でNある過去のベース秒を設定します。N同様に、クロノメーターを停止すると、クロノメーターによって表示される時間は、以前に設定された基準 ( getBase()) と現在 ( SystemClock.elapsedRealtime()) の間の経過時間であるため、減算されます。

于 2016-11-13T04:26:33.607 に答える
11

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);
    }
}
于 2014-10-20T15:24:09.353 に答える