Таймер обратного отсчета, который имеет параметр увеличения / уменьшения, который может быть установлен пользователем - PullRequest
1 голос
/ 15 декабря 2011

Я новичок в языке Java, но раньше работал с языком Си. Я пробовал много способов решить следующую проблему, но не смог, поэтому мне нужна помощь. Я пытаюсь сделать следующее:

• Установить 5-минутный таймер (счетчик) по умолчанию, поэтому он запускается при нажатии кнопки Start_.

• Если кнопка Start_button не нажата, а пользователь нажимает кнопку Up_button / Down_button, то на экране отображаются параметры таймера; 5, 10 и 15 минут, и если пользователь нажимает кнопку Starts_button, он начинает обратный отсчет выбранного таймера.

• Во время работы таймера;

  •If Up_button /Down_button is pressed once then reset timer and show previous time setting i.e. 5, 10 or 15minutes.
  •If Up_button /Down_button is pressed again then display timer options on screen and if the user presses Starts_button it starts the timer chosen.  

На данный момент; таймер срабатывает после нажатия кнопки «Пуск» и отсчитывает 5 минут. Но я не знаю, как лучше отобразить параметры таймера, а также запустить выбранный таймер.

Ваша помощь приветствуется, большое спасибо заранее.

Как упомянуто выше; Я нахожусь в процессе изучения Java-программирования, поэтому будьте спокойны со мной ;-) и покажите мне код, который, по вашему мнению, лучше всего подходит для этой проблемы, пожалуйста

Это то, что я сделал до сих пор:

public class Test extends Activity {

// Display Counter Variables
public static Button Up, Down, Green;

TextView timeDisplay;
MyCount counter, counter1, counter2;
int state = 0;
int length = 300000; //5minutes
int length1 = 600000; //10minutes
int length2 = 900000; //15minutes
long startTime = 0;
long currentTime = 0;
long timeElapsed = 0;
long timeRemaining = 0;
long prevTimeRemaining = 0;
boolean up_pressed = false;
boolean down_pressed = false;
private boolean timerStarted=false;

Button start;

  public String formatTime(long millis) {
        String output = "";
        long seconds = millis / 1000;
        long minutes = seconds / 60;

        seconds = seconds % 60;
        minutes = minutes % 60;

        String secondsD = String.valueOf(seconds);
        String minutesD = String.valueOf(minutes);

        if (seconds < 10)
          secondsD = "0" + seconds;
        if (minutes < 10)
          minutesD = "0" + minutes;

        output = minutesD + " : " + secondsD;
        return output;
      }


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);


    timeDisplay = (TextView) findViewById(R.id.timer);
    counter = new MyCount (length, 1000);
    counter1 = new MyCount (length1, 1000);
    counter2 = new MyCount (length2, 1000);

    start = (Button) findViewById(R.id.Button);
    Up = (Button)findViewById(R.id.Yellow);
    Down = (Button)findViewById(R.id.Blue);



start.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        switch (state) {
        case 0:
          startTime = System.currentTimeMillis();
            counter.start();
            timerStarted=true;
            start.setText(R.string.pause);
              state=1;

          break;

       case 1:
          // pause
          currentTime = System.currentTimeMillis();
          timeElapsed = currentTime - startTime;
          if (prevTimeRemaining == 0)
            timeRemaining = length - timeElapsed;
          else
            timeRemaining = prevTimeRemaining - timeElapsed;
          counter.cancel();
          timeDisplay.setText("" + formatTime(timeRemaining));
          start.setText(R.string.resume);
          prevTimeRemaining = timeRemaining;

          // resume
          counter = new MyCount(timeRemaining, 1000);
          state = 0;
          break;

        case 2:
          prevTimeRemaining = 0;
          timerStarted=false;
          counter = new MyCount(length, 1000);
          start.setText(R.string.start);
          timeDisplay.setText(R.string.timer);
          state = 0;
        }
    }
});


    Up.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            down_pressed=true;

            if(up_pressed=true && timerStarted==true 
                || timerStarted==false){
                //Display timer (increment i.e. show 5min --> 10min ..> 15min)

                //start timer chosen by user
            }

        }
    });


    Down.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            down_pressed=true;
            if(down_pressed=true && timerStarted==true 
                || timerStarted==false){
                //Display timer (decrement i.e. show 15min --> 10min ..> 5min)

                //start timer chosen by user
            }
        }
    });
}


  public class MyCount extends CountDownTimer {

      public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
      }

      public void onFinish() {
        timeDisplay.setText("done!");
        state = 2;
       start.setText(R.string.restart);
      }

      public void onTick (long millisUntilFinished) {
        timeDisplay.setText ("Left: "  + formatTime(millisUntilFinished));

      }

    }

}

1 Ответ

0 голосов
/ 15 декабря 2011

Я не думаю, что вам нужен новый класс для этого.

Я бы просто создал глобальную переменную, например.

private CountDownTimer myCount;

Я бы порекомендовал поместить это в метод, подобный

private void setTimer(long countdownMs, long tickMs) {
  CountDownTimer myCount = new CountDownTimer(countdownMs,tickMs) {
  /// TODO
  }.start();
}

Если вам нужно перезапустить таймер, вы можете позвонить

myCount.cancel()
setTimer(...);

Прокомментируйте, если вам нужно больше деталей:)

...