java - 计时器的倒数计时器

标签 java android

我正在尝试制作一个番茄计时器(工作 25 分钟,休息 5 分钟,然后重复 n 次)。但我找不到一种方法让休息计时器自动启动,然后用工作计时器再次启动(工作计时器 = 00:10 - 休息计时器 = 00:03,我输入这些值以便可以更快地测试)。我该如何解决这个问题?

public class MainActivity extends AppCompatActivity {

TextView tvTimer, tvSessions;
ImageView ivStart, ivStop;
SeekBar seekBar;

CountDownTimer countDownTimer;

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

    tvTimer = findViewById(R.id.tvTimer);
    tvSessions = findViewById(R.id.tvSessions);
    ivStart = findViewById(R.id.ivStart);
    ivStop = findViewById(R.id.ivStop);
    seekBar = findViewById(R.id.seekBar);

    seekBar.setMax(2500);
    seekBar.setProgress(10);
    seekBar.setVisibility(View.GONE);

    tvTimer.setText("00:10");

}

// ON CLICK METHODS

public void startTimer(View v){
    countDownTimer = new CountDownTimer(seekBar.getProgress() * 1000 + 100, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            updateTimer((int) millisUntilFinished / 1000);
        }

        @Override
        public void onFinish() {
            breakTimer();
        }
    };

    countDownTimer.start();
}

public void stopTimer(View v){

}

// UPDATE METHODS

private void breakTimer(){
    seekBar.setProgress(3);
    tvTimer.setText("00:03");
}

private void updateTimer(int progress){
    int minutes = progress / 60;
    int seconds = progress - minutes * 60;

    String textMinutes = String.valueOf(minutes);
    String textSeconds = String.valueOf(seconds);

    if(seconds < 10) textSeconds = "0" + textSeconds;
    if(minutes < 10) textMinutes = "0" + textMinutes;

    tvTimer.setText(textMinutes + ":" + textSeconds);
}
}

预期输出:

00:10 -> 00:00 -> 00:03 -> 00:00 -> 00:10 and so on...

最佳答案

像这样的事情怎么样?使用标志来跟踪计时器是休息计时器还是番茄计时器。

当计时器结束时,您检查标志来决定接下来启动哪个计时器(并翻转标志,以便下次执行相反的操作)。

import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

    private static final int TICK_EVERY_SECOND = 1000;

    private TextView tvTimer, tvSessions;
    private ImageView ivStart, ivStop;
    private SeekBar seekBar;

    private CountDownTimer countDownTimer;

    private boolean isRest = false;
    private int userSelectedDurationSeconds = -1;

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

        tvTimer = findViewById(R.id.tvTimer);
        tvSessions = findViewById(R.id.tvSessions);
        ivStart = findViewById(R.id.ivStart);
        ivStop = findViewById(R.id.ivStop);
        seekBar = findViewById(R.id.seekBar);

        seekBar.setMax(2500);
        seekBar.setProgress(10);
        seekBar.setVisibility(View.GONE);

        tvTimer.setText("00:10");

    }

    // ON CLICK METHODS

    public void startTimer(View v) {
        isRest = false;
        int durationSeconds = seekBar.getProgress();
        userSelectedDurationSeconds = durationSeconds;
        restartTimer(durationSeconds);
    }

    private void restartTimer(int durationSeconds) {
        countDownTimer = new CountDownTimer(TimeUnit.SECONDS.toMillis(durationSeconds), TICK_EVERY_SECOND) {
            @Override
            public void onTick(long millisUntilFinished) {
                updateTimer((int) millisUntilFinished / 1000);
            }

            @Override
            public void onFinish() {
                breakTimer();
            }
        };

        countDownTimer.start();
    }

    public void stopTimer(View v) {

    }

    // UPDATE METHODS

    private void breakTimer() {
        isRest = !isRest;
        if(isRest) {
            seekBar.setProgress(3);
            tvTimer.setText("00:03");
            restartTimer(3);
        } else {
            restartTimer(userSelectedDurationSeconds);
        }
    }

    private void updateTimer(int progressInSeconds) {
        int minutes = progressInSeconds / 60;
        int seconds = progressInSeconds - minutes * 60;

        String textMinutes = String.valueOf(minutes);
        String textSeconds = String.valueOf(seconds);

        if (seconds < 10) textSeconds = "0" + textSeconds;
        if (minutes < 10) textMinutes = "0" + textMinutes;

        tvTimer.setText(textMinutes + ":" + textSeconds);
    }
}

关于java - 计时器的倒数计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59951550/

相关文章:

java - 如何在两个线程之间来回切换

java - 包装类如何将数据类型的值包装在其对象周围?

android - Unity 的 Facebook 插件 (v5.0.2 BETA) 缺少 bin 文件夹

android - 无法设置应用程序图标

android - 无需调用 onCreate 即可更改方向

java - 内存内部和整数作为输出?

java - 为什么需要强制转换为 (LayoutManager) 来设置布局?

java - 使用 JTabbedPane 重叠选项卡

android.view.InflateException - 傻瓜式 Android 应用程序开发

java - Android Studio 模拟器不会运行简单的 Hello World 应用程序