図形のアニメーション処理手法について詳しく触れていきます。
iアプリでアニメーション処理を行う場合には、状態を保存する変数を用意し、その変数を定期変更するようにします。今回は、図形の弧の角度を変えるようにアニメーションさせてみましょう。
次のようにTestCanvasクラスに、現在の角度と速さを保存するための変数「mouth」と「dm」を用意します。
28:class TestCanvas extends Canvas{
29: /** 口の開く角度 */
30: int mouth = 45;
31: /** 口の動く速さ */
32: int dm = -8;
33:
paintメソッドでの描画がその変数の示す状態を反映するようにします。
描画の前後のlock/unlockメソッドは、画面がちらつかないための、いわば保険です。画面を丸々再描画するような場合には、このようにしておくと、描画過程が表示されることがないのでちらつかなくなります。
また、描画処理の始めに、以前の描画を消去するためのclearRectメソッドを呼び出しています。そのように処理をしなければ、以前の描画状態が残ったままになってしまいます。
37: public void paint(Graphics g) {
38: Font f = Font.getFont(Font.TYPE_DEFAULT);
39: int ofset = f.getAscent();
40: g.lock();
41: g.clearRect(0, 0, getWidth(), getHeight());
42: g.drawString("動きます",10,10 + ofset);
43: g.setColor(Graphics.getColorOfName(Graphics.BLUE));
44: g.fillArc(50, 110, 30, 30, mouth, 360 - mouth * 2);
45: g.unlock(true);
46: }
アニメーションのための定期的なイベントを発生させるには、ShortTimerクラスのオブジェクトを使います。getShortTimerメソッドには、タイマーイベントを受け取るCanvas、タイマーを識別するID、タイマーの間隔(ミリ秒)、繰り返すかどうかを指定します。
ここでは50ミリ秒ごとにイベントが発生するように指定していますが、イベントが発生する最短の間隔は機種によって違うので、指定よりも長い間隔になることもあります。
電話着信の際にはこのタイマーは停止します。再開させる時のため、IApplicationクラスのresumeメソッドをオーバーライドしてタイマーを再開させる処理を記述してください。
20: public void start() {
21: Canvas c = new TestCanvas();
22: Display.setCurrent(c);
23: ShortTimer st = ShortTimer.getShortTimer(c, 1, 50, true);
24: st.start();
25: }
タイマーイベントが発生するとprocessEventが呼び出されるので、イベントの処理はこのメソッドをオーバーライドして記述します。
低レベルAPIでのイベントは、すべてprocessEventメソッドで処理を行います。イベント類は第一引数の値で識別します。
タイマーイベントの場合は第一引数の値がDisplay.TIMER_EXPIRED_EVENTになっています。
Copyright © ITmedia, Inc. All Rights Reserved.