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

Другие вопросы по тегам