2011-04-08 58 views

回答

110

你是要去需要,保持跟蹤已經過去了,因爲該天文臺開始的時間變量:

long timeWhenStopped = 0; 

更新變量的值,當你停止這樣的記時計:

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

我們也將使用這個變量開始之前調整計時錶:

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

最後如果你有辦法重置你的天文鐘,那麼你應該記得重置timeWhenStopped變量。類似這樣的:

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

精彩回答:) – 2011-08-25 09:40:26

+1

很好的答案...與良好的描述..! 它應該被接受爲答案.. @ andveand如果它工作..! – 2012-04-02 05:53:13

+0

爲什麼這不是公認的答案?適合我,謝謝! – jamesc 2012-06-13 16:16:45

9

我爲此做了一個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

兩個其他的答案是相同的,而天文臺的顯示屏上工作得非常好,但他們有一個缺陷: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())之間的時間間隔,因此爲減法。

相關問題