グラフィックス(1)-Viewクラスへの描画


グラフィックスは機能が豊富で、またしても、理解できない部分が多くありましたが、とりあえずわかる範囲でまとめてみました。

 

まず、グラフィックスの最初の一歩として、今回は、Viewクラスへのグラフィックの描画に限定して、みていくことにします。

グラフィックスの基本形-Viewクラスへのグラフィックの描画

まずは、以前に「独自のViewクラスを使う」 で紹介したコードを基に、Viewクラスの描画領域に簡単な図形を表示してみます。

リスト1(GraphicsSample1.java)

Viewクラスの場合、通常、onDrawメソッドをオーバーライトして、そこにグラフィックを描画するコードを記述します。

onDrawメソッドでは、Paintオブジェクトを作成して、描画色を緑色に設定した後、左上端に四角形の図形を描画しています。

このコードを実行すると、以下のような画面が表示されます。

 

 

ユーザからのイベントに応答する

Viewクラスを継承したクラスで、ユーザからのイベントに対応するためには、Viewクラスのイベントハンドラをオーバライトします。

Viewクラスの、ユーザからのイベントに対応するイベントハンドラには、以下のものがあります。

  • onFocusChanged
    ビューにフォーカスされた、またはビューからフォーカスが外れた時に、呼び出される。
  • onScrollChanged
    画面がスクロールした時に、呼び出される。
  • onSizeChanged
    Viewのサイズが変更された時に、呼び出される。
  • onKeyDown
    キーが押された時に、呼び出される。
  • onKeyUp
    キーが離された時に、呼び出される。
  • onTrackballEvent
    トラックボールによる動作が発生した時に、呼び出される。
  • onTouchEvent
    タッチスクリーンによる動作が発生した時に、呼び出される。
  • onMotionEvent
    タッチパネル操作が発生した時に、呼び出される。

キーイベントに応答するためには、View#setFocusableメソッドを使って、Viewクラスにフォーカスが取得できるようにする必要があります。

Viewクラスの外部から、イベントリスナーを設定して、イベントを処理する事もできます。

イベントリスナーの例については、ウィジェットのイベント処理を参照して下さい。

以下に、ゲームプログラム等でよく使われるであろう、イベント処理のプログラムの例を示します。

リスト2(GViewEvent.java)

このプログラムを実行すると、リスト1と同じく左上隅に、緑色の四角形の図形が表示されます。

キーバッドで左右上下のボタンを押すと、onKeyDownメソッドの処理にて、図形が移動します。

画面をタッチして、左右上下に動かしても、onTouchEventメソッドの処理にて、同様に、図形が移動します。

 

Viewクラスでは、onDrawメソッドをオーバーライトする事で、画面にグラフィックを描画できますが、 プログラムから意識的に画面を再描画させる場合は、View#invalidateメソッドを実行します。

invalidateメソッドを実行する事により、再度、onDrawメソッドが呼び出されます。

定期的に画像を再描画-壁にあたって跳ね返る図形のアニメーション

invalidateメソッドを実行する事により、再度、onDrawメソッドが呼び出されます。

グラフィック画像が動き回るプログラムのサンプルとして、壁にあたって跳ね返る図形のアニメーションを、Viewに実装してみました。

リスト3(GraphicsSample2.java)

画像を動かすためには、タイマーを使って、定期的に画面を書き換える必要があります。

アンドロイドでは、別スレッドでGUIを操作する事ができないため、ここではHandlerクラスを使って、この動作を実現しています。

onAttachedToWindowイベントとonDetachedFromWindowイベントは、ViewがActivityにアタッチおよびデタッチされるタイミングで、発生します。

このタイミングで、タイマーの開始と終了を、HandlerとフラグisAttachedで制御しています。

Handlerクラスについては「HandlerとMessage - 別スレッドでのGUI操作」を参照して下さい。

プログラム終了時にタイマーを止めないと、ゾンビのようにタイマー処理が生き残ってしまうので、Viewがデタッチされるタイミングで、 フラグを使ってタイマーを終了させています。

60行目のLog出力は、プログラム終了時にタイマーが停止するか、確認するためのものです。

画面を書き換えるには、リスト2と同様、invalidateメソッドを実行します。

縦画面と横画面の表示の変化に対応するため、onSizeChangedイベントで、View画面の大きさが変化されるタイミングで、 画面の大きさを変数screenWidthとscreenHeightを使って取得しています。

参考URL

 

ページのトップへ戻る