我正在尝试用 Java 制作一个简单的倒数计时器,它重复执行一组指令。我希望用户能够在代码运行时实时控制该执行的频率(在 Android 上使用 SeekBar)。 到目前为止,这是我的尝试:
final CountDownTimer countDownTimer = new CountDownTimer(rsvp.wordsOfSentence.length * rsvp.pace, rsvp.pace) {
@Override
public void onTick(long millisInFuture) {
targetTextView.setText(rsvp.wordsOfSentence[rsvp.getCurrentWord()]);
rsvp.incrementCurrentWord();
}
@Override
public void onFinish() {
targetTextView.setText(rsvp.wordsOfSentence[rsvp.getCurrentWord()]);
}
};
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
rsvp.setPace(progress);}
});
方法setPace()改变了int pace的值(都是在RSVP类中设置的,rsvp是这个类的一个对象)。所以我试图将步速传递给 CountDown Timer 作为引用,但我不确定我是否正确执行此操作。定时器执行代码,但用户无法控制频率。
提前致谢,如果有什么不清楚的地方请原谅我,我刚开始玩 Java :)
最佳答案
如果您想坚持使用 CountDownTimer
,您可以在搜索栏更改时执行此操作:
- 停止当前倒计时
- 以新的步调创建新的倒数计时器
- 开始新的倒计时
或者,您可以使用 Handler
类的 postDelayed
延迟后执行某些操作的方法,但这只执行一次操作,因此您需要一次又一次地调用它。我认为这可以更轻松地更改速度,因为您可以在搜索栏更改时使用不同的毫秒数调用 postDelayed
。
我已经编写了这个使用上述方法的小 Timer
类:
public class Timer {
private Handler handler;
private boolean paused;
private int interval;
private Runnable task = new Runnable () {
@Override
public void run() {
if (!paused) {
runnable.run ();
Timer.this.handler.postDelayed (this, interval);
}
}
};
private Runnable runnable;
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public void startTimer () {
paused = false;
handler.postDelayed (task, interval);
}
public void stopTimer () {
paused = true;
}
public Timer (Runnable runnable, int interval, boolean started) {
handler = new Handler ();
this.runnable = runnable;
this.interval = interval;
if (started)
startTimer ();
}
}
您可以使用 getter 和 setter 轻松获取和设置 interval
字段。
用法:
Timer timer = new Timer(new Runnable() {
@Override
public void run() {
// code to run in each tick of the timer here...
}
}, someInterval, true);
// the timer will start automatically if you pass true as the third argument.
关于Java - 即时改变倒数计时器的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48993795/