2017-04-06 74 views
0

我想創建一個帶有圓形進度條的計時器。我已經找到一個很好的例子,開始http://www.androidtutorialshub.com/android-count-down-timer-tutorial/。這個例子有我需要的外觀,但我想添加暫停和恢復功能。所以,我確實有暫停和恢復工作,但是,當我點擊「暫停」,然後「恢復」,進度條從頭開始爲一秒鐘的唾液,然後從位置暫停設置開始(這是目標)。我的猜測是進度條在某處設置爲100%,然後用暫停位置替換,但我找不到可能發生的部分。不能獲得暫停和恢復功能與進度條一起工作

改性mainActivity代碼:

public class MainActivity extends AppCompatActivity { 

    private long timeCountInMilliSeconds = 1 * 60000; 
    long startTime; 
    long difference; 
    long difference1; 
    private enum TimerStatus { 
     STARTED, 
     STOPPED, 
    } 

    private TimerStatus timerStatus = TimerStatus.STOPPED; 

    private ProgressBar progressBarCircle; 
    private EditText editTextMinute; 
    private TextView textViewTime; 
    private ImageView imageViewReset; 
    private ImageView imageViewStartStop; 
    private CountDownTimer countDownTimer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     progressBarCircle = (ProgressBar) findViewById(R.id.progressBarCircle); 
     editTextMinute = (EditText) findViewById(R.id.editTextMinute); 
     textViewTime = (TextView) findViewById(R.id.textViewTime); 
     imageViewReset = (ImageView) findViewById(R.id.imageViewReset); 
     imageViewStartStop = (ImageView) findViewById(R.id.imageViewStartStop); 

     imageViewReset.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       reset(); 
      } 
     }); 

     imageViewStartStop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       pauseResume(); 
      } 
     }); 
    } 

    private void reset() { 
     stopCountDownTimer(); 
     restartCountDownTimer(); 
    } 

    private void pauseResume() { 
     if (timerStatus == TimerStatus.STOPPED) { 
      timeCountInMilliSeconds = 1 * 50000; 
      // setProgressBarValues(timeCountInMilliSeconds); 
      progressBarCircle.setMax((int) (timeCountInMilliSeconds)/1000); 
      progressBarCircle.setProgress((int) (timeCountInMilliSeconds)/1000); 
      imageViewReset.setVisibility(View.VISIBLE); 
      imageViewStartStop.setImageResource(R.drawable.icon_stop); 
      editTextMinute.setEnabled(false); 
      timerStatus = TimerStatus.STARTED; 
      startCountDownTimer(); 
      startTime = System.currentTimeMillis(); 

     } else { 
      imageViewReset.setVisibility(View.GONE); 
      imageViewStartStop.setImageResource(R.drawable.icon_start); 
      editTextMinute.setEnabled(true); 
      timerStatus = TimerStatus.STOPPED; 
      stopCountDownTimer(); 
      if(difference == 0) { 
       difference = System.currentTimeMillis() - startTime; 
      } 
      else{ 
       difference1 = System.currentTimeMillis() - startTime; 
       difference += difference1;} 
     } 

    } 

    private void startCountDownTimer() { 
     countDownTimer = new CountDownTimer(timeCountInMilliSeconds - difference, 1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       textViewTime.setText(hmsTimeFormatter(millisUntilFinished)); 
       progressBarCircle.setProgress((int) (millisUntilFinished/1000)); 
      } 

      @Override 
      public void onFinish() { 

       textViewTime.setText(hmsTimeFormatter(timeCountInMilliSeconds - difference)); 
       // setProgressBarValues(timeCountInMilliSeconds - difference); 
       progressBarCircle.setMax((int) (timeCountInMilliSeconds - difference)/1000); 
       progressBarCircle.setProgress((int) (timeCountInMilliSeconds - difference)/1000); 
       imageViewReset.setVisibility(View.GONE); 
       imageViewStartStop.setImageResource(R.drawable.icon_start); 
       editTextMinute.setEnabled(true); 
       timerStatus = TimerStatus.STOPPED; 
      } 
     }.start(); 
     countDownTimer.start(); 
    } 

    private void restartCountDownTimer() { 
     difference = 0; 
     difference1 = 0; 
     countDownTimer = new CountDownTimer(timeCountInMilliSeconds, 1000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       textViewTime.setText(hmsTimeFormatter(millisUntilFinished)); 
       progressBarCircle.setProgress((int) (millisUntilFinished/1000)); 
      } 

      @Override 
      public void onFinish() { 

       textViewTime.setText(hmsTimeFormatter(timeCountInMilliSeconds)); 
       // setProgressBarValues(timeCountInMilliSeconds); 
       progressBarCircle.setMax((int) (timeCountInMilliSeconds)/1000); 
       progressBarCircle.setProgress((int) (timeCountInMilliSeconds)/1000); 
       imageViewReset.setVisibility(View.GONE); 
       imageViewStartStop.setImageResource(R.drawable.icon_start); 
       editTextMinute.setEnabled(true); 
       timerStatus = TimerStatus.STOPPED; 
      } 
     }.start(); 
     countDownTimer.start(); 
    } 

    private void stopCountDownTimer() { 
     countDownTimer.cancel(); 

    } 

    private String hmsTimeFormatter(long milliSeconds) { 

     String hms = String.format("%02d:%02d:%02d", 
       TimeUnit.MILLISECONDS.toHours(milliSeconds), 
       TimeUnit.MILLISECONDS.toMinutes(milliSeconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliSeconds)), 
       TimeUnit.MILLISECONDS.toSeconds(milliSeconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliSeconds))); 
     return hms; 
    } 
} 

XML文件是相同的,如上述(鏈接到樣本代碼)提供的鏈接。

任何幫助將非常感激。

回答

0

可能是錯誤在您的pauseResume。你說progressBarCircle.setProgress((int) (timeCountInMilliSeconds)/1000);。這將當前進度設置爲指定值。在你的情況下,這意味着你的最大值相同的值。我認爲你應該將整個模塊移動到onCreate方法中。

timeCountInMilliSeconds = 1 * 50000; 
progressBarCircle.setMax((int) (timeCountInMilliSeconds)/1000); 
progressBarCircle.setProgress((int) (timeCountInMilliSeconds)/1000); 

它應該足以在開始時初始化這些值一次。

[編輯]

的行爲似乎對我好。假設定時器在47秒時按暫停,現在取決於您的定時,定時器可以在999毫秒或001毫秒內暫停。 (指向邊緣情況)。在第一種情況下,您必須等待幾秒鐘,精確到999毫秒,直到計時器切換顯示狀態。在秒數情況下,感覺應用程序直接響應,因爲您只需等待001毫秒。如果要解決這個問題,你的正常化值difference像這樣:

private void pauseResume() { 
    if (timerStatus == TimerStatus.STOPPED) { 
     ... 
    } else { 
     ... 
     difference += (((int) (System.currentTimeMillis() - startTime)/1000) + 1) * 1000; 
    } 

} 

我也去掉了usless difference1變量。 我做的另一個改進是,我刪除了if else聲明,因爲它也沒用。 您也可以刪除+ 1以始終等待1秒。在看到可視化的東西之前。

+0

還有一件事,計時器和進度條在按下簡歷後稍後開始。我該如何解決這個問題? – Oleh

+0

我編輯了我的答案來回答你的問題。希望這會有所幫助。 – Neoklosch

+0

@Oleh這有幫助嗎? – Neoklosch