我是 Android 开发新手,目前正在尝试实现一个非常简单的倒数计时器,该计时器将在到达 00:00 后继续计数,但在低于 00:00 时文本颜色为红色。
我有两个问题: 1)它从比我设置的少一秒开始计数(在示例中,它从 00:09 而不是 00:10 开始)。 2) 到达 00:00 后,在下一个刻度时,它将文本变为红色,但将计数器保持在 00:00(后一部分不是有意的),然后继续计数为 -00:01、-00:02 等. 因此,00:00 会计数两次,一次为白色,一次为红色。有什么想法为什么会发生这种情况吗?这是我的代码:
public class myTimerActivity extends Activity {
Chronometer mainTimer;
long mStartValue = 10; // Countdown value
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the user interface for this Activity
setContentView(R.layout.activity_mytimer);
// Initialize Chronometer object
mainTimer = (Chronometer) findViewById(R.id.chronometer);
mainTimer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
if (SystemClock.elapsedRealtime()>=chronometer.getBase()) {
chronometer.setTextColor(Color.parseColor("#FF0000"));
};
}
});
mainTimer.setFormat("%s");
mainTimer.setBase(SystemClock.elapsedRealtime()+mStartValue*1000);
mainTimer.start();
}
...
}
更新: 这是罗杰建议的另一个实现:
public class myTimerActivity extends Activity {
long mStartValue = 10; // Countdown value
private TextView txtCounter;
private static final String FORMAT_COUNTER = "%02d:%02d:%02d";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the user interface for this Activity
setContentView(R.layout.activity_mytimer);
txtCounter = (TextView)findViewById(R.id.mTextField);
new CountDownTimer(mStartValue*1000, 1000) {
public void onTick(long millisUntilFinished) {
txtCounter.setText("" + String.format(FORMAT_COUNTER,
TimeUnit.MILLISECONDS.toHours(millisUntilFinished), // HOURS PASSED
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)), // MINUTES PASSED (over the hours)
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)) // SECONDS PASSED (over the minutes)
));
}
public void onFinish() {
txtCounter.setTextColor(Color.parseColor("#FF0000"));
}
}.start();
}
...
}
出现问题的原因是框架的 Chronometer 类通过截断毫秒的除法来计算秒,而此时它应该对结果进行四舍五入。
我创建了一个自定义类来避免这个问题。
在此处查看更多详细信息:https://stackoverflow.com/a/76991683/4195337