2012年7月26日木曜日

定期処理ハンドラを用いて、Viewを再描画する

Androidでは、定期処理ハンドラを用いて、一定時間毎に処理を呼び出すことができます。
今回は、sleep()メソッドとHandleMessage()メソッドを用いたHandlerクラスを作成し、Viewの表示を一定時間毎に再描画することで、以下の画像のようなカウントアップを行うアプリについてご紹介します。
 
では、続きをどうぞ。
Handlerクラス
まず、定期処理の土台となる、Handlerクラスを継承したSampleHanlerクラスを作成します。
1
2
3
//定期処理ハンドラ
public class SampleHandler extends Handler {
}
Handlerクラスを継承することで、定期的な処理の実行が可能となります。
では、内部に定期的に実行したい処理を記述していきます。
まず、handleMessage()メソッドを記述してみます。
handleMessage()は、Handlerクラスが持つメソッドで、メッセージを受信することで起動します。
1
2
3
4
5
6
public class SampleHandler extends Handler {
   @Override
   public void handleMessage(Message msg) {
       sampleView.invalidate(); //1.
   }
}
1.で、invalidate()メソッドによってsampleViewの再描画を行っています。
次に、handleMessage()を起動するため、handleMessage()に対し、定期的にメッセージを送る必要があります。
では、定期的にメッセージを送信するsleep()メソッドを追加してみましょう。
Ex.)1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SampleHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        sampleView.invalidate();  //2.
        if (sampleHandler!=null) sampleHandler.sleep(1000);  //3.
    }
 
    //スリープメソッド
    public void sleep(long delayMills) {
        //使用済みメッセージの削除
        removeMessages(0);
        sendMessageDelayed(obtainMessage(0),delayMills);  //4.
    }
}
コード中の 3. でsleep()メソッドを呼び出しています。
sleep()メソッドでは、引数に指定された時間(ここでは1000ミリ秒)後に、メッセージを新たに取得し、送信しています(4.)。
あとは、以下のようにsampleHandlerのインスタンスを生成し、sleep()メソッドを実行すれば、その後は指定時間(1000ミリ秒)毎にhandleMessage()メソッドにメッセージが送られ、メソッドが実行されることになります。
1
2
3
4
5
6
7
@Override
public void onResume() {
    super.onResume();
    //定期処理ハンドラの生成と実行
    sampleHandler=new SampleHandler();
    sampleHandler.sleep(0);
}

また、定期処理ハンドラを停止したい場合は、以下のようにします。

1
sampleHandler=null;

アプリを中断、終了する際は、忘れずにこの処理を記述しましょう。

最後に、Ex.)1で使用したsampleView(2.)の中身は、以下のSampleViewのインスタンスです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SampleView extends View {
    private static int count = 0;
 
    //コンストラクタ
    public SampleView(Context context) {
        super(context);
        setBackgroundColor(Color.WHITE);
    }
 
    //描画
    @Override
    protected void onDraw(Canvas canvas) {
        count++;  //5.
        //描画オブジェクトの生成
        Paint paint=new Paint();
        paint.setAntiAlias(true);
        paint.setTextSize(30);
 
        //Countの描画
        canvas.drawText("Count>"+count,0,40*1,paint);  //6.
    }
}
SampleViewでは、onDraw()メソッドが呼び出される毎にCountを1ずつ加算し(5.)、Countの値を描画しています(6.)。
つまりEx.)1では、数字が約一秒ずつカウントアップされるような動きになります。

0 件のコメント:

コメントを投稿