簡単にカウントダウンするタイマーアプリを作りたいときは、CountDownTimerクラスを使うと作成できます。
2021.2.1
CountDownTimer
CountDownTimer を継承したクラスを作り
インスタンスにカウントダウンを始める時間とインターバルを設定します
1 |
CountDownTimer(long millisInFuture, long countDownInterval) |
- long millisInFuture:カウントダウン開始時間
- long countDownInterval:インターバル時間
onTick
(long millisUntilFinished) が設定したインターバル時間で呼ばれる
millisUntilFinished で残りの時間が分かる
1 2 3 4 5 6 |
class CountDown extends CountDownTimer { ... public void onTick(long millisUntilFinished) { ... } } |
まとめると
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.os.CountDownTimer; import android.os.Bundle; import android.widget.Button; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Locale; public class MainActivity extends AppCompatActivity { private TextView timerText; private final SimpleDateFormat dataFormat = new SimpleDateFormat("mm:ss.SSS", Locale.US); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 3分= 3x60x1000 = 180000 msec long countNumber = 180000; // インターバル msec long interval = 10; Button startButton = findViewById(R.id.start_button); Button stopButton = findViewById(R.id.stop_button); timerText = findViewById(R.id.timer); timerText.setText(dataFormat.format(0)); // インスタンス生成 // CountDownTimer(long millisInFuture, long countDownInterval) final CountDown countDown = new CountDown(countNumber, interval); startButton.setOnClickListener(v -> { // 開始 countDown.start(); }); stopButton.setOnClickListener(v -> { // 中止 countDown.cancel(); timerText.setText(dataFormat.format(0)); }); } class CountDown extends CountDownTimer { CountDown(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); } @Override public void onFinish() { // 完了 timerText.setText(dataFormat.format(0)); } // インターバルで呼ばれる @Override public void onTick(long millisUntilFinished) { // 残り時間を分、秒、ミリ秒に分割 //long mm = millisUntilFinished / 1000 / 60; //long ss = millisUntilFinished / 1000 % 60; //long ms = millisUntilFinished - ss * 1000 - mm * 1000 * 60; //timerText.setText(String.format("%1$02d:%2$02d.%3$03d", mm, ss, ms)); timerText.setText(dataFormat.format(millisUntilFinished)); } } } |
レイアウトです
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dp" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <TextView android:id="@+id/timer" android:layout_margin="20dp" android:textSize="60sp" android:textColor="#00f" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="@string/start" android:id="@+id/start_button" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="@string/stop" android:id="@+id/stop_button" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> |
リソースです
strings.xml
1 2 3 4 5 |
<resources> <string name="app_name">TestCountDownTimer</string> <string name="start">Start</string> <string name="stop">Stop</string> </resources> |
時間の表示を [分:秒.ミリ秒] で表現したいときには SimpleDateFormat を使うと便利です。ミリ秒で表されるmillisecがあるとすると、分:秒.ミリ秒(3桁)はこのようにします。
1 2 3 |
SimpleDateFormat dataFormat = new SimpleDateFormat("mm:ss.SSS", Locale.US); String time = dataFormat.format(millisec); |
但し、これは時刻を表示するものを便宜的に使ったのでLocaleの設定をしないとWarningが出ます。
年月日も追加してみるとわかりますが、startしてからの時間計測はこの例では、起点である1970/1/1からの時間ということになってしまいます。
あるいは、以下のように計算してフォーマットに入れることもできます。
1 |
String.format("%1$02d:%2$02d.%3$03d", mm, ss, ms) |
インターバルは10msecですがあまり短くしても表示が追いつかないのと
バッテリー消費が激しくなりますので注意です。実機次第です
またこの設定では1msec単位まで表示されているかもしれませんが精度はあまり期待できません、あくまで10msecと設定したインターバルです。
タイマー関連: