Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计时器的倒计时计时器_Java_Android - Fatal编程技术网

Java 计时器的倒计时计时器

Java 计时器的倒计时计时器,java,android,Java,Android,我正在尝试制作一个Pomodoro计时器(工作25分钟,休息5分钟,然后重复n次)。但是我找不到一种方法让中断计时器自动启动,然后用工作计时器重新启动(工作计时器=00:10-中断计时器=00:03,我输入了这些值以便可以更快地测试)。我怎样才能解决这个问题 public class MainActivity extends AppCompatActivity { TextView tvTimer, tvSessions; ImageView ivStart, ivStop; SeekBar

我正在尝试制作一个Pomodoro计时器(工作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);
}
}
public类MainActivity扩展了AppCompatActivity{
文本视图tvTimer,TVTSessions;
ImageView ivStart、ivStop;
SeekBar-SeekBar;
倒计时倒计时;
@凌驾
创建时受保护的void(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”);
}
//点击式方法
公共无效起始计时器(视图五){
countDownTimer=新的countDownTimer(参见kbar.getProgress()*1000+1001000){
@凌驾
公共void onTick(长毫秒未完成){
updateTimer((int)毫秒/1000);
}
@凌驾
公共无效onFinish(){
中断计时器();
}
};
countDownTimer.start();
}
公共无效停止计时器(视图v){
}
//更新方法
私有void breakTimer(){
seekBar.setProgress(3);
tvTimer.setText(“00:03”);
}
私有void更新程序(int progress){
int分钟=进度/60;
整数秒=进度-分钟*60;
String textMinutes=String.valueOf(分钟);
String textSeconds=String.valueOf(秒);
如果(秒<10)textSeconds=“0”+textSeconds;
如果(分钟<10)textMinutes=“0”+textMinutes;
tvTimer.setText(textMinutes+“:”+textSeconds);
}
}
预期产出:

00:10->00:00->00:03->00:00->00:10等等


像这样的怎么样。使用标志跟踪计时器是静止计时器还是波莫多罗计时器

当计时器完成时,您检查标志以决定下一步启动哪个计时器(并翻转标志,以便下一次它执行相反的操作)

导入android.os.Bundle;
导入android.os.CountDownTimer;
导入android.view.view;
导入android.widget.ImageView;
导入android.widget.SeekBar;
导入android.widget.TextView;
导入androidx.appcompat.app.appcompat活动;
导入java.util.concurrent.TimeUnit;
公共类MainActivity扩展了AppCompatActivity{
私有静态最终整数每秒钟勾选一次=1000;
专用文本视图tvTimer、tvSessions;
私有图像视图ivStart、ivStop;
私人SeekBar SeekBar;
私人倒计时;
私有布尔值isRest=false;
private int userSelectedDurationSeconds=-1;
@凌驾
创建时受保护的void(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”);
}
//点击式方法
公共无效起始计时器(视图五){
isRest=false;
int durationSeconds=seekBar.getProgress();
用户选择的持续时间秒=持续时间秒;
重启计时器(持续时间秒);
}
专用void重新启动计时器(int durationSeconds){
countDownTimer=新的countDownTimer(TimeUnit.SECONDS.toMillis(durationSeconds),每秒钟勾选一次){
@凌驾
公共void onTick(长毫秒未完成){
updateTimer((int)毫秒/1000);
}
@凌驾
公共无效onFinish(){
中断计时器();
}
};
countDownTimer.start();
}
公共无效停止计时器(视图v){
}
//更新方法
私有void breakTimer(){
isRest=!isRest;
如果(isRest){
seekBar.setProgress(3);
tvTimer.setText(“00:03”);
重启计时器(3);
}否则{
重启计时器(用户选择的持续时间秒);
}
}
私有void updateTimer(int-progressUnseconds){
整数分钟=进度秒/60;
整数秒=ProgressUnseconds-minutes*60;
String textMinutes=String.valueOf(分钟);
String textSeconds=String.valueOf(秒);
如果(秒<10)textSeconds=“0”+textSeconds;
如果(分钟<10)textMinutes=“0”+textMinutes;
tvTimer.setText(textMinutes+“:”+textSeconds);
}
}

它几乎可以正常工作。当我按下播放按钮时,它不是从00:09开始,而是从00:08开始,然后,当它达到00:00时,它直接显示00:02而不是00:03好的,我通过在TimeUnit.SECONDS.toMillis(durationSeconds)+100中添加“+100”来修复它(我去掉了你的+100,这允许它从更高的数字开始(但从技术上讲,这是一个较长的计时器:)@lorenzo1723如果你觉得这很有帮助,请记得向上投票或将其标记为已回答
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);
    }
}