簡體   English   中英

為 android 暫停 java 中的倒數計時器

[英]pause a reversed countdown timer in java for android

我正在制作一個計時器,它有一個按鈕,我可以控制選擇計數模式或倒計時模式。 倒計時模式運行良好,啟動、暫停、重置。 在 Android studio 中,倒數計時器是通過倒數計時器制成的。 問題是我不能暫停倒數計時器並從它停止的地方恢復。 這樣做的正確方法是什么? 我知道它可以通過計時器來完成計數模式,但我正在嘗試制作一個自定義的計時器小部件,正如我之前提到的,可以按下一個按鈕讓用戶決定他想要哪種模式。 因此,如果可能的話,我不想在當前設置中使用另一個小部件。

public void startBuiltInTimer(int millisecondCountingInterval) {

    if (getTimeInMillis() > 0) { //getTimeInMillis will read the time value in the current Timer widget, which is a textView
        builtInTimerIsCounting = true; //set the timer is running flag
        showAsCounting(true);
        if (getTimerCountUpOrDown() == TIMER_COUNT_DOWN) { //countdown mode
            countDownTimer = new CountDownTimer(getTimeInMillis(), millisecondCountingInterval) {
                @Override
                public void onTick(long millisUntilFinished) {
                    setTime(millisUntilFinished);
                    }
                }

                @Override
                public void onFinish() {
                    setTime(0);
                    builtInTimerIsCounting = false;
                    showAsCounting(false);
                    }

                }
            }.start();
        } else if (getTimerCountUpOrDown() == TIMER_COUNT_UP) { //count up mode
            long tempTimeInMillis = getTimeInMillis() + lastTimeMillisUntilFinished; //trying to save the last time value in millis and keep the total time value as user defined.
            setTime(0); //set initial value of the textView to show the count-up timer start from zero, initially.
            countDownTimer = new CountDownTimer(tempTimeInMillis, millisecondCountingInterval) {
                @Override
                public void onTick(long millisUntilFinished) {
                    long temp = tempTimeInMillis - millisUntilFinished;
                    setTime(temp); //reverse the countdown to count-up
                    lastTimeMillisUntilFinished = millisUntilFinished;//keep the millisUntilFinished for next start. 
                }

                @Override
                public void onFinish() {
                    setTime(tempTimeInMillis);
                    builtInTimerIsCounting = false;
                    showAsCounting(false);
                    }

                }
            }.start();
        }
    }

}

編輯:我最終使用 SystemClock 來跟蹤和記錄倒數計時器。 這是代碼。

else if (getTimerCountUpOrDown() == TIMER_COUNT_UP) {
        startCountUpTimer(millisecondCountingInterval);
}

public void startCountUpTimer(int millisecInterval) {
    if (!countUpTimerIsRunning) {
        handler = new Handler();
        myRunnable = new MyRunnable(millisecInterval);    //MyRunnable can pass a variable thru to let handler have more flexibility with postDelay method. You can still use regular Runnable with hard coded time interval in millisec.
        startTime = SystemClock.uptimeMillis();    //use startTime to mark the time when the count up timer start ticking
        handler.postDelayed(myRunnable, millisecInterval);
        countUpTimerIsRunning = true;
    }

}

public class MyRunnable implements Runnable {
    private int interval;

    public MyRunnable(int t) {
        this.interval = t;
    }

    @Override
    public void run() {
        millisecondTime = SystemClock.uptimeMillis() - startTime;    //this is the time value measured by the count up timer
        updateTime = timeBuff + millisecondTime;   
        setTime(updateTime);
        if (updateTime <= countUpMode_Threshold) {
            handler.postDelayed(this, interval);
        } else {
            setTime(countUpMode_Threshold);
            handler.removeCallbacks(myRunnable);
            builtInTimerIsCounting = false;
            showAsCounting(false);
            if (onBuiltInTimerStatusChangeListener != null) {
                onBuiltInTimerStatusChangeListener.onStatusChange(OnBuiltInTimerStatusChangeListener.STATUS_FINISHED);
            }
        }
    }
}

public void pauseCountUpTimer() {
    timeBuff += millisecondTime;
    handler.removeCallbacks(myRunnable);
    countUpTimerIsRunning = false;
}

一種方法是您應該手動跟蹤暫停時間並從該時間再次啟動計時器。 或者您可以嘗試使用此鏈接上的實用程序它具有您正在尋找的功能。 很有幫助

也許是這樣的:

private CountDownTimer timer;
private long COUNT_DOWN = -1;
private long COUNT_UP = 1;


public void startBuiltInTimer(boolean isDown) {
    if (isdown) {
       launchTimer(COUNT_DOWN);
    } else {
       launchTimer(COUNT_UP);
    }
}

public void launchTimer(long interval) {
    builtInTimerIsCounting = true; //set the timer is running flag
    showAsCounting(true);

    timer = new CountDownTimer(getTimeInMillis(), TimeUnit.SECONDS.toMillis(interval) {

    @Override
    public void onTick(long time) {
         setCountdownText(time.intValue());
         setTimeInMillis(time);
    }

    @Override
    public void onFinish() {
        setCountdownText(time.intValue());
        builtInTimerIsCounting = false;
        showAsCounting(false);
   }
}.start();

public void stopTimer() {
    timer.cancel();
}

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM