Java 计时器的倒计时计时器
我正在尝试制作一个Pomodoro计时器(工作25分钟,休息5分钟,然后重复n次)。但是我找不到一种方法让中断计时器自动启动,然后用工作计时器重新启动(工作计时器=00:10-中断计时器=00:03,我输入了这些值以便可以更快地测试)。我怎样才能解决这个问题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
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);
}
}