CountDownTimer というクラスが用意されているので、それを使えばタイマー作成には結構便利。
CountDownTimer は、そのままだと一時停止が使えないので、一時停止するにはちょっと工夫が必要だ。そのやり方については、こちらの記事を参考にさせて頂いた。
ただ、参考元のやり方そのままだと、ボタンが増えて画面がちょっと煩雑になってしまう。
ストップウォッチ感覚で直感的に操作できるようにしたいので、スタート、ストップは同じボタンにしたい。
Androidには標準で『トグルボタン』という、ON/OFFを切り替えられる便利なボタンがあるので、それを利用してタイマーを自分なりに再作成してみた。
トグルボタンは、AndroidStudioのパレットからドラッグ・アンド・ドロップでXML上に配置できる。
配置したトグルボタンは、JavaでOnCheckedChangeListener に関連付け、下記の様に、if (isChecked) - else で分けて、ON/OFF時の処理をそれぞれ記載する。
toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { // トグルボタンがONの際の処理を記述 } else { // トグルボタンがOFFの際の処理を記述 } } });
今回のタイマーでは、
[ON] タイマーをインスタンス化 → スタート
[OFF] タイマーをストップ
という処理を記述した。
ついでに setOnLongClickListener で、トグルボタンをロングクリックした時にタイマーをリセットするように設定した。
ロングクリックでリセットする際には、トグルボタンをOFFに変更する。そうしないと、タイマーはリセットされて動いていないのに、トグルがONのままという状況が発生してしまう。
以下、ソースコード全体
MainActivity.java
import android.os.CountDownTimer; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.View; import android.widget.CompoundButton; import android.widget.TextView; import android.widget.ToggleButton; public class MainActivity extends ActionBarActivity { static MyCountDownTimer myCountDownTimer; // CountDownTimerクラスを継承して、MyCountDownTimerを定義 class MyCountDownTimer extends CountDownTimer { TextView textView = (TextView)findViewById(R.id.textView); ToggleButton toggleButton = (ToggleButton)findViewById(R.id.toggleButton); public MyCountDownTimer(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); } // カウントダウン処理 @Override public void onTick(long millisUntilFinished) { textView.setText(String.valueOf(millisUntilFinished / 1000)); // ミリ秒 → 秒に変換して)残り時間を表示 } // カウントダウン終了後の処理 @Override public void onFinish() { toggleButton.setChecked(false); // toggleボタンをオフにする } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // トグルボタンをタップした時の処理 ((ToggleButton)findViewById(R.id.toggleButton)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // トグルON if (isChecked) { String time = ((TextView) findViewById(R.id.textView)).getText().toString(); // テキストビューの文字列を取得して、timeに格納 myCountDownTimer = new MyCountDownTimer(Integer.parseInt(time) * 1000, 100); // timeをint型に変換した後、ミリ秒に変換。その時間をセットしたmyCountDownTimerをインスタンス化 myCountDownTimer.start(); // タイマーをスタート // トグルOFF } else { myCountDownTimer.cancel(); // タイマーをストップ } } }); // トグルボタンをロングタップした時の処理 ((ToggleButton)findViewById(R.id.toggleButton)).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { myCountDownTimer.cancel(); // タイマーをストップ ((TextView)findViewById(R.id.textView)).setText("15"); // テキストビューに初期値をセット ((ToggleButton)findViewById(R.id.toggleButton)).setChecked(false); // toggleボタンをオフにする return true; } }); } }
activity_main.xml
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="15" android:id="@+id/textView" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> <ToggleButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New ToggleButton" android:id="@+id/toggleButton" android:layout_below="@+id/textView" android:layout_centerHorizontal="true" /> </RelativeLayout>
如何でしょうか。
(関連)
2015/3/10 【Android】【CountDownTimer】 0秒まで表示する (インターバルの挙動を調べてみる)
2015/3/10 【Android】【CountDownTimer】 一時停止の仕組みを改善する その①
2015/3/11 【Android】【CountDownTimer】 一時停止の仕組みを改善する その②
0 件のコメント:
コメントを投稿