【AndroidのViewを制する】 Chronometerを使いこなしてタイマーを作成する
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); } }