2011-04-08 21 views
29

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

Respuesta

110

Estás a necesitar una variable que realiza un seguimiento en el tiempo que ha pasado desde que se inició el cronómetro:

long timeWhenStopped = 0; 

actualizar el valor de la variable cuando se detiene el cronómetro de la siguiente manera:

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

también vamos a utilizar esta variable para ajustar el cronómetro antes de iniciarlo:

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

Y finalmente, si tiene una manera de restablecer su cronómetro, debe recordar también restablecer la variable timeWhenStopped. Algo como esto:

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

maravillosa respuesta :) –

+1

great answer ... with good discription .. !! Debe aceptarse como respuesta .. @andveand si funciona ... !! –

+0

¿Por qué no es esta la respuesta aceptada? Me funciona bien, gracias! – jamesc

9

Hice una clase 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); 
    } 
} 
3

Las dos otras respuestas son idénticos, 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í es mi sugerencia, base 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); 
    } 
} 

Hay 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 siendo el valor actual del temporizador (0 en caso de primer arranque). De forma 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.