Android 为什么millisUntilFinished无法检测到精确的倒计时时间间隔?
嘿,大家好,倒计时有一个很小但很烦人的问题。。目前,我将间隔设置为1000。我正在尝试检测我的内存中剩余的毫秒数Android 为什么millisUntilFinished无法检测到精确的倒计时时间间隔?,android,text-to-speech,Android,Text To Speech,嘿,大家好,倒计时有一个很小但很烦人的问题。。目前,我将间隔设置为1000。我正在尝试检测我的内存中剩余的毫秒数 onTick() 方法。这样我就可以在还剩20秒、10秒等时使用文本转换语音。如果我使用: //Speak when 20 seconds left if (millisUntilFinished == 20000) { tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null); } 计时
onTick()
方法。这样我就可以在还剩20秒、10秒等时使用文本转换语音。如果我使用:
//Speak when 20 seconds left
if (millisUntilFinished == 20000) {
tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null);
}
计时器无法准确检测20000毫秒
所以我不得不求助于:
//Speak when 20 seconds left
if (millisUntilFinished < 20999) {
if (millisUntilFinished > 19999) {
tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null);
}
}
//还剩20秒时说话
如果(毫秒小于20999){
如果(毫微秒级>19999){
tts.speak(“您还有20秒。”,TextToSpeech.QUEUE\u FLUSH,null);
}
}
问题是,有时文本到语音转换在这段时间内会出现两次。有没有办法精确检测毫秒数,这样我就不必使用大于或小于
有没有办法精确检测毫秒数,这样我就不必使用大于或小于
当然不是。Android不是RTOS。由于主应用程序线程在任何给定时刻都可能被其他任务占用,因此计时将是近似的。如果您想要更大的灵活性,您也可以尝试以下方法
int secondsLeft = 0;
new CountDownTimer(30000, 100) {
public void onTick(long ms) {
if (Math.round((float)ms / 1000.0f) != secondsLeft)
{
secondsLeft = Math.floor((float)ms / 1000.0f);
if (secondsLeft == 20) {
tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null);
}
}
}
public void onFinish() {
}
}.start();
从你可以使用一个技巧。如果使用计时器小部件而不是TexView,则可以制作如下内容:
int time = 30;
Chronometer chrono = (Chronometer) findViewById(R.id.your_chronometer_id);
chrono.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
chronometer.setText(String.valueOf(_time));
if(_time == 20) tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null);
if(_time == 0){
//Time finished, make your stuff
chronometer.stop();
}else{
_time--;
}
}
});
有点脏,但添加一次布尔值以防止重复说话非常简单。