temporizador studio online cronometro clase android chronometer

studio - Android_Chronometer pausa



temporizador android studio (3)

Quiero hacer una pausa en el cronómetro y, después de hacer clic en el botón, quiero continuar con el chromoneter para contar ... Busco pero no puedo relacionar una función con esto ... ¿cómo puedo hacerlo?


Hice una clase de PauseableChronometer para esto.

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); } }


Las otras dos respuestas son idénticas y funcionan muy bien en la pantalla del cronómetro, pero tienen un defecto: timeWhenStopped , así como el valor devuelto por getCurrentTime() , es negativo.

Aquí está mi sugerencia, basándome en estas dos respuestas:

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); } }

Tienes que entender SystemClock.elapsedRealtime() como un indicador de "ahora". Entonces, cuando (re) iniciemos el cronómetro, estableceremos la base N segundos en el pasado, N es el valor actual del temporizador (0 en caso de primer arranque). De manera similar, al detener el cronómetro, el tiempo mostrado por el cronómetro es el tiempo transcurrido entre la base establecida anteriormente ( getBase() ) y ahora ( SystemClock.elapsedRealtime() ), de ahí la resta.


Necesitará una variable que haga un seguimiento del tiempo transcurrido desde que se inició el Cronómetro:

long timeWhenStopped = 0;

Actualice el valor de la variable cuando detenga el cronómetro de esta manera:

timeWhenStopped = mChronometer.getBase() - SystemClock.elapsedRealtime(); mChronometer.stop();

También usaremos esta variable para ajustar el cronómetro antes de iniciarlo:

mChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped); mChronometer.start();

Y, por último, si tiene una manera de restablecer su cronómetro, entonces debería recordar restablecer también la variable timeWhenStopped. Algo como esto:

mChronometer.setBase(SystemClock.elapsedRealtime()); timeWhenStopped = 0;