グラフィックス(1)-Viewクラスへの描画
グラフィックスは機能が豊富で、またしても、理解できない部分が多くありましたが、とりあえずわかる範囲でまとめてみました。
まず、グラフィックスの最初の一歩として、今回は、Viewクラスへのグラフィックの描画に限定して、みていくことにします。
グラフィックスの基本形-Viewクラスへのグラフィックの描画
まずは、以前に「独自のViewクラスを使う」 で紹介したコードを基に、Viewクラスの描画領域に簡単な図形を表示してみます。
Viewクラスの場合、通常、onDrawメソッドをオーバーライトして、そこにグラフィックを描画するコードを記述します。
onDrawメソッドでは、Paintオブジェクトを作成して、描画色を緑色に設定した後、左上端に四角形の図形を描画しています。
このコードを実行すると、以下のような画面が表示されます。
ユーザからのイベントに応答する
Viewクラスを継承したクラスで、ユーザからのイベントに対応するためには、Viewクラスのイベントハンドラをオーバライトします。
Viewクラスの、ユーザからのイベントに対応するイベントハンドラには、以下のものがあります。
- onFocusChanged
ビューにフォーカスされた、またはビューからフォーカスが外れた時に、呼び出される。 - onScrollChanged
画面がスクロールした時に、呼び出される。 - onSizeChanged
Viewのサイズが変更された時に、呼び出される。 - onKeyDown
キーが押された時に、呼び出される。 - onKeyUp
キーが離された時に、呼び出される。 - onTrackballEvent
トラックボールによる動作が発生した時に、呼び出される。 - onTouchEvent
タッチスクリーンによる動作が発生した時に、呼び出される。 - onMotionEvent
タッチパネル操作が発生した時に、呼び出される。
キーイベントに応答するためには、View#setFocusableメソッドを使って、Viewクラスにフォーカスが取得できるようにする必要があります。
Viewクラスの外部から、イベントリスナーを設定して、イベントを処理する事もできます。
イベントリスナーの例については、ウィジェットのイベント処理を参照して下さい。
以下に、ゲームプログラム等でよく使われるであろう、イベント処理のプログラムの例を示します。
このプログラムを実行すると、リスト1と同じく左上隅に、緑色の四角形の図形が表示されます。
キーバッドで左右上下のボタンを押すと、onKeyDownメソッドの処理にて、図形が移動します。
画面をタッチして、左右上下に動かしても、onTouchEventメソッドの処理にて、同様に、図形が移動します。
Viewクラスでは、onDrawメソッドをオーバーライトする事で、画面にグラフィックを描画できますが、 プログラムから意識的に画面を再描画させる場合は、View#invalidateメソッドを実行します。
invalidateメソッドを実行する事により、再度、onDrawメソッドが呼び出されます。
定期的に画像を再描画-壁にあたって跳ね返る図形のアニメーション
invalidateメソッドを実行する事により、再度、onDrawメソッドが呼び出されます。
グラフィック画像が動き回るプログラムのサンプルとして、壁にあたって跳ね返る図形のアニメーションを、Viewに実装してみました。
画像を動かすためには、タイマーを使って、定期的に画面を書き換える必要があります。
アンドロイドでは、別スレッドでGUIを操作する事ができないため、ここではHandlerクラスを使って、この動作を実現しています。
onAttachedToWindowイベントとonDetachedFromWindowイベントは、ViewがActivityにアタッチおよびデタッチされるタイミングで、発生します。
このタイミングで、タイマーの開始と終了を、HandlerとフラグisAttachedで制御しています。
Handlerクラスについては「HandlerとMessage - 別スレッドでのGUI操作」を参照して下さい。
プログラム終了時にタイマーを止めないと、ゾンビのようにタイマー処理が生き残ってしまうので、Viewがデタッチされるタイミングで、 フラグを使ってタイマーを終了させています。
60行目のLog出力は、プログラム終了時にタイマーが停止するか、確認するためのものです。画面を書き換えるには、リスト2と同様、invalidateメソッドを実行します。
縦画面と横画面の表示の変化に対応するため、onSizeChangedイベントで、View画面の大きさが変化されるタイミングで、 画面の大きさを変数screenWidthとscreenHeightを使って取得しています。
参考URL
- Android Developers
- リファレンス
- 愚鈍人