特集:Eclipseで始めるiアプリ――低レベルAPI編(2/10 ページ)

» 2004年10月27日 13時55分 公開
[きしだ なおき,ITmedia]

アニメーション処理のノウハウ

 図形のアニメーション処理手法について詳しく触れていきます。

 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.

注目のテーマ