クロノメーターを一時停止したいのですが、ボタンをクリックした後、クロモメーターのカウントを続行したいです...検索しましたが、これに関連する機能がありませんでした..どうすればいいですか?
3 に答える
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;
他の 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()
) の間の経過時間であるため、減算されます。
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);
}
}