図形のアニメーション処理手法について詳しく触れていきます。
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ミリ秒ごとにイベントが発生するように指定していますが、イベントが発生する最短の間隔は機種によって違うので、指定よりも長い間隔になることもあります。
|
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.