【AndroidのViewを制する】 Chronometerを使いこなしてタイマーを作成する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

Android開発を始めたばかりの開発者がまず作ろうとするもの、それはカウントタイマーじゃないだろうか。
私もカウントタイマーを作った経験がある、たくさんの開発者はこの経験から非同期処理を知り、次の開発にその知識を生かしている。

Chronometerとは

android.widgetに存在するカウントタイマーそのものである。
このクラスを使うことで”H:MM:SS”または”MM:SS”の形式でカウントアップしたりカウントダウンすることができる。

Chronometer#startとChronometer#stop

Chronometer#startを呼ぶことでカウントダウンまたはカウントアップが開始します。
Chronometer#stopを呼ぶことでカウントダウンまたはカウントアップが停止します。
また、動いているChronometerは必ず停止しましょう。

Chronometer chronometer = new Chronometer(this);
//カウントタイマーを動かし開始するメソッドです
chronometer.start(); 
//カウントタイマーを動かし停止するメソッドです
chronometer.stop(); 

Chronometer#setFormatとChronometer#getFormat

Chronometer#setFormatを使うことでChronometerに表示される文字列のフォーマットを変更することができます。
Chronometer#setFormatの第一引数は文字列です。
この文字列の中に”%s”を含めることで、%sを”H:MM:SS”または”MM:SS”に置換してくれます。
Chronometer#getFormatは設定されているフォーマットを取得することができます。

 
Chronometer chronometer = new Chronometer(this);
//表示される文字列を"今はMM:SSです"に変更するメソッドです。
chronometer.setFormat("今は%sです");
//設定されている文字列を取得するメソッドです。
String format = chronometer.getFormat();

Chronometer#setOnChronometerTickListenerとChronometer#getOnChronometerTickListener、OnChronometerTickListener

Chronometer#setOnChronometerTickListenerはChronometerの時間が変化したタイミングでコールバックされるリスナーです。
引数にはOnChronometerTickListenerをとります、OnChronometerTickListenerは表示が変化するタイミングでOnChronometerTickListener#onChronometerTickが呼ばれます。
Chronometer#getOnChronometerTickListenerは設定されているインターフェースを取得できます。

 
Chronometer chronometer = new Chronometer(this);
//表示が変更されるたびに呼ばれるコールバックインターフェースを設定する。
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
    @Override
    public void onChronometerTick(Chronometer chronometer) {
       Log.d("you", "onChronometerTick: " + chronometer.getText());
    }
});
//設定されているコールバックインターフェースを取得するメソッドです。
Chronometer.OnChronometerTickListener onChronometerTickListener = chronometer.getOnChronometerTickListener();

Chronometer#setBaseとChronometer#getBase

Chronometer#setBaseを使うとSystemClock.elapsedRealtime、つまり端末の起動からの経過時間を表示するようになります。
Chronometer#setBaseの引数はlong型の値を取ります、この値をSystemClock.elapsedRealtimeから引いた値を表示開始時間にします。
引数にSystemClock.elapsedRealtimeを渡すとChronometerは”00:00″から開始されます。
Chronometer#getBaseは設定されている値を取得することができます。

 
Chronometer chronometer = new Chronometer(this);
//カウントタイマーの表示開始を端末の起動時間にするメソッドです。
//引数を渡すことで時間を補正することができます。
chronometer.setBase(0);
//補正した値を取得するメソッドです。
long base = chronometer.getBase();

Chronometer#setCountDownとChronometer#isCountDown

Chronometer#setCountDownを使うことでタイマーのカウントアップとカウントダウンを切り替えることができます。
Chronometer#isCountDownを使うことで現在のカウントアップやカウントダウンのどちらかを知ることができます。
しかし、APILevelが24と高いことが難点です。

 
Chronometer chronometer = new Chronometer(this);
//カウントタイマーのカウントダウンとカウントアップを切り替えるメソッドです。
//trueでカウントダウン、falseでカウントアップになります。
chronometer.setCountDown(true);
//現在のカウントダウンやカウントアップのどちらに取得するメソッドです。
boolean countDown = chronometer.isCountDown();

Chronometerのまとめ

今回はChronometerの使い方を調べました。
Chronometerを使うことで自前で作る必要がなくなるので非同期処理を減らすことができます。

 
public class ChronometerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Chronometer chronometer = new Chronometer(this);
        chronometer.setFormat("今は%sです");
        String format = chronometer.getFormat();
        Log.d("you", format);
        chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {
                if(chronometer.getText().equals("今は00:10です")){
                    Log.d("you", "onChronometerTick: 停止します");
                    chronometer.stop();
                }
            }
        });
        Chronometer.OnChronometerTickListener onChronometerTickListener = chronometer.getOnChronometerTickListener();
        chronometer.start();
        setContentView(chronometer);
    }
}