Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Chronometer

Компонент Chronometer находился в разделе Date в старых версиях студии. Позволяет пользователю запускать и останавливать начальный отсчёт времени, а также задавать время запуска таймера.

Основные методы:

  • start() — запускает отсчёт времени;
  • stop() — останавливает отсчёт времени;
  • setFormat() — задаёт формат отображения времени. По умолчанию используется формат "MM:SS" или "H:MM:SS". Можно задать свой формат, при этом в строке format первое встреченное «%s», будет заменено на «HH:MM». Например: «Time: %s» будет выводить время «Time: 01:30»

Класс Chronometer имеет интерфейс OnChronometerTickListener.

Поместите на экран активности компонент Chronometer и три кнопки Старт, Стоп, Сброс.

Напишем код для запуска, остановки и сброса секундомера. Весь код сводится обработке щелчков кнопки.


package ru.alexanderklimov.chronometer;

import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Chronometer;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Chronometer mChronometer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mChronometer = findViewById(R.id.chronometer);

        mChronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {
                long elapsedMillis = SystemClock.elapsedRealtime()
                        - mChronometer.getBase();

                if (elapsedMillis > 5000) {
                    String strElapsedMillis = "Прошло больше 5 секунд";
                    Toast.makeText(getApplicationContext(),
                            strElapsedMillis, Toast.LENGTH_SHORT)
                            .show();
                }
            }
        });
    }

    public void onStartClick(View view) {
        mChronometer.setBase(SystemClock.elapsedRealtime());
        mChronometer.start();
    }

    public void onStopClick(View view) {
        mChronometer.stop();
    }

    public void onResetClick(View view) {
        mChronometer.setBase(SystemClock.elapsedRealtime());
    }
}

Chronometer

В примере также добавлена реализация OnChronometerTickListener - когда секундомер отсчитает 5 секунд, то появится всплывающее сообщение.

Обратный отсчёт

В API 24 появился новый метод setCountDown(), позволяющий работать в режиме обратного отсчёта. Родственный XML-атрибут для него - android:countDown. Метод isCountDown() позволит узнать, в каком режиме работает хронометр.


private Chronometer mChronometer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mChronometer = findViewById(R.id.chronometer);
    mChronometer.setCountDown(true);
    // установим начальное значение
    mChronometer.setBase(SystemClock.elapsedRealtime() + 1000 * 5);
}	

public void onClick(View view) {
    mChronometer.setBase(SystemClock.elapsedRealtime() + 1000 * 5);
    Log.i("Chronometer", "Обратный отсчёт: " + mChronometer.isCountDown());
    mChronometer.start();
}

Последний отсчёт

Читая документацию, наткнулся на новый метод из API 26 (Android 8.0 Oreo) - isTheFinalCountDown(). Я запустил этот код и чуть не упал со стула от неожиданности - неожиданно в телефоне заиграл видеоролик с песней "The Final Countdown/Последний отсчёт" группы "Европа/Europe". Разработчики развлекаются.

Реклама