Android-хронометр с обратным отсчетом
Я новичок в разработке под 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();
}
...
}
1 ответ
Проблема возникает из-за того, что класс Chronometer платформы вычисляет секунды, усекая деление миллисекунд, тогда как он должен округлять результат.
Я создал собственный класс, который позволяет избежать этой проблемы.
Более подробную информацию см. здесь: /questions/52003225/nevernoe-nachalnoe-znachenie-hronometra/66246974#66246974