Question Pause Android_Chronometer


Je veux faire une pause chronomètre et après je clique sur le bouton je veux continuer le chromonètre pour compter ... je recherche mais ne pourrait pas une fonction liée à cela .. comment peut-on le faire?


31
2018-04-08 12:13


origine


Réponses:


Vous aurez besoin d'une variable qui garde la trace du temps écoulé depuis le début du chronomètre:

long timeWhenStopped = 0;

Mettez à jour la valeur de la variable lorsque vous arrêtez le chronomètre comme ceci:

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

Nous allons également utiliser cette variable pour ajuster le chronomètre avant de le démarrer:

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

Et enfin, si vous avez un moyen de réinitialiser votre chronomètre, n'oubliez pas de réinitialiser également la variable timeWhenStopped. Quelque chose comme ça:

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

118
2017-08-15 12:32



J'ai fait un PauseableChronometer classe pour cela.

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

10
2017-10-20 15:24



Les deux autres réponses sont identiques et fonctionnent très bien sur l'affichage du chronomètre, mais elles ont un défaut: timeWhenStopped, ainsi que la valeur renvoyée par getCurrentTime(), est négatif.

Voici ma suggestion, basée sur ces deux réponses:

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

Vous devez comprendre SystemClock.elapsedRealtime() comme indicateur pour "maintenant". Donc, quand on (re) démarrera le chronomètre, on posera la base N secondes dans le passé, N étant la valeur actuelle du temporisateur (0 en cas de premier démarrage). De même, lors de l’arrêt du chronomètre, le temps affiché par le chronomètre est le temps écoulé entre la base précédemment définie (getBase()) et maintenant (SystemClock.elapsedRealtime()), d’où la soustraction.


5
2017-11-13 04:26