Я хочу приостановить хронометр, и после того, как я нажму кнопку, я хочу продолжить отсчет хромометра... Я искал, но не мог связать эту функцию.. как это сделать?
Android_Chronometer pause
Ответ 1
Вам понадобится переменная, которая отслеживает время, прошедшее с момента запуска Chronometer:
long timeWhenStopped = 0;
Обновите значение переменной при остановке хронометра следующим образом:
timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime();
mChronometer.stop();
Мы также будем использовать эту переменную для настройки хронометра перед ее запуском:
mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
mChronometer.start();
И, наконец, если у вас есть способ reset вашего хронометра, тогда вы также должны запомнить reset переменную timeWhenStopped. Что-то вроде этого:
mChronometer.setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
Ответ 2
Я сделал для этого класс 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);
}
}
Ответ 3
Два других ответа одинаковы и очень хорошо работают на дисплее Chronometer, но у них есть один недостаток: timeWhenStopped
, а также значение, возвращаемое getCurrentTime()
, отрицательно.
Вот мое предложение, основываясь на этих двух ответах:
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()
как индикатор для "сейчас". Поэтому, когда мы запустим хронометр, в прошлом мы установили базовую N
секунды, N
- текущее значение таймера (0 в случае первого запуска).
Аналогично, при остановке хронометра время, отображаемое хронометром, - это время, прошедшее между ранее установленным основанием (getBase()
) и теперь (SystemClock.elapsedRealtime()
), следовательно, вычитание.