Java - 即时改变倒数计时器的速度
Java - Changing pace of CountDown Timer on the fly
我正在尝试在 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的值(两者都在classRSVP中设置,rsvp是这个class的一个对象)。所以我试图将步速传递给 CountDown Timer 作为参考,但我不确定我是否正确执行此操作。定时器执行代码,但用户无法控制频率。
提前致谢,如有不明之处请见谅,我刚开始玩 Java :)
如果您想坚持使用 CountDownTimer
,您可以在搜索栏更改时执行此操作:
- 停止当前倒数计时器
- 以新的步调创建新的倒数计时器
- 开始新的倒计时
或者,你可以使用Handler
class的postDelayed
方法在延迟后做一些动作,但是这个动作只做一次,所以你需要一次又一次地打电话。我认为这可以更轻松地更改速度,因为您可以在搜索栏更改时使用不同的毫秒数调用 postDelayed
。
我写了这个Timer
class,它利用了上面的方法:
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 中制作一个简单的倒数计时器,它重复执行一组指令。我希望用户能够在代码为 运行 时实时控制该执行的频率(在 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的值(两者都在classRSVP中设置,rsvp是这个class的一个对象)。所以我试图将步速传递给 CountDown Timer 作为参考,但我不确定我是否正确执行此操作。定时器执行代码,但用户无法控制频率。
提前致谢,如有不明之处请见谅,我刚开始玩 Java :)
如果您想坚持使用 CountDownTimer
,您可以在搜索栏更改时执行此操作:
- 停止当前倒数计时器
- 以新的步调创建新的倒数计时器
- 开始新的倒计时
或者,你可以使用Handler
class的postDelayed
方法在延迟后做一些动作,但是这个动作只做一次,所以你需要一次又一次地打电话。我认为这可以更轻松地更改速度,因为您可以在搜索栏更改时使用不同的毫秒数调用 postDelayed
。
我写了这个Timer
class,它利用了上面的方法:
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.