2017-04-06 6 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); 

最初にこれらの値を1回初期化するだけで十分です。

[編集]

行動が私には良いようです。たとえば、タイマーが47秒で、現在のタイミングに応じてポーズを押すと、タイマーは999ミリ秒または001ミリ秒で一時停止できます。 (エッジケースを指す)。最初のケースでは、タイマーが目に見える状態になるまで「ほぼ」1秒間、正確には999ミリ秒待たなければなりません。秒の場合、アプリが直接応答するように感じます。なぜなら、あなたは001ミリ秒待つだけで済むからです。あなたはそれを修正したい場合は、そのようなあなたのdifference値を正規化:

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

} 

私もusless difference1変数を削除しました。 もう1つ改善しましたが、役に立たないので、if elseステートメントを削除しました。 + 1を削除して、常に1秒待つようにすることもできます。視覚的なものを見る前に。

+0

さらにもう1つ、タイマーとプログレスバーは、レジュームが押されてから2秒後に開始されます。どうすればそれを修正することもできますか? – Oleh

+0

あなたの質問に答えるために私の答えを編集しました。うまくいけば助けになると思う。 – Neoklosch

+0

@Olehこれは役に立ちますか? – Neoklosch

関連する問題