Освой Android играючи

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

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
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 и три кнопки Старт, Стоп, Сброс.

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


// Kotlin
// Если этот код работает, его написал Александр Климов,
// а если нет, то не знаю, кто его писал.

package ru.alexanderklimov.chronometer

import android.os.Bundle
import android.os.SystemClock
import android.widget.Chronometer
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private lateinit var chronometer: Chronometer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        chronometer = findViewById(R.id.chronometer)
        chronometer.setOnChronometerTickListener {
            val elapsedMillis: Long = (SystemClock.elapsedRealtime() - chronometer.base)
            if (elapsedMillis > 5000 && elapsedMillis < 6000) {
                val strElapsedMillis = "Прошло больше 5 секунд"
                Toast.makeText(
                    this,
                    strElapsedMillis, Toast.LENGTH_SHORT
                ).show()
            }
        }

        startButton.setOnClickListener {
            chronometer.base = SystemClock.elapsedRealtime()
            chronometer.start()
        }

        stopButton.setOnClickListener {
            chronometer.stop()
        }

        resetButton.setOnClickListener {
            chronometer.base = SystemClock.elapsedRealtime()
        }
    }
}

// Java 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". Разработчики развлекаются.

Дополнительные материалы

Секундомер

Реклама