Подтвердить что ты не робот

Android_Chronometer pause

Я хочу приостановить хронометр, и после того, как я нажму кнопку, я хочу продолжить отсчет хромометра... Я искал, но не мог связать эту функцию.. как это сделать?

4b9b3361

Ответ 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()), следовательно, вычитание.