読者です 読者をやめる 読者になる 読者になる

Shut the fuck up and write some code

グダグダ言わずにコードを書きたいブログ

SurfaceViewについて

Android

AndroidSDKについてるサンプルゲームLunarLanderのソースを読み始めてものはいいものの、処理構造がさっぱり分からん。特にSurfaceViewとループ処理につまづきっぱなしです。Androidの描画にはviewではなくSurfaceViewを使うのが宜しいらしいという話は聞いたものの処理方法/実装方法が皆目検討も付かない・・・ネットを徘徊して情報をかき集めたので先にまとめます。


今まではonDrawが呼ばれて勝手に描画されてたのですがSurfaceViewでは

  1. 描画するにはCanvasインスタンスを取得する必要がある
  2. Canvasインスタンスを取得するにはSurfaceHolderのlockCanvasメソッドを使用する。このときスレッドにロックがかかり他からは処理できない。
  3. SurfaceHolderはSurfaceViewのgetHolderで参照できる。
  4. Canvasに描画したあとはSurfaceHolder.unlockCasnvasAndPast(Canvas)でロックを解除する


まとめると

SurfaceHolder = SurfaceView.getHolder();
Canvas = SurfaceHolder.lockCanvas();
Canvas.drawColor(Color.WHITE); //背景色を白
SurfaceHolder.unlockCanvasAndPast(Canvas);

こんな感じのフローになると思われる。


んでSurfaceViewの起動時からループ処理に入るには起動時のイベント処理を呼ぶ必要があるのだけど、そのイベント処理をSurfaceHolder.Callbackで実装する。

class testSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
    public testSurfaceView(Context context) {
        super(context);
    SurfaceHolder.addCallback(this);
(以下略)


これでSurfaceView起動時にsurfaceCreatedが呼ばれるのでここからスレッドを開始してループ処理に入れる。

    public void surfaceCreated(SurfaceHolder holder) {
        thread=new Thread(this);
        thread.start();
    }


ちなみにSurfaceViewにcallbackで呼び出されるメソッドは

surfaceChanged
surfaceCreated
surfaceDestroyed

の三つ。適時Override。


レファレンス
http://developer.android.com/reference/android/view/SurfaceHolder.Callback.html


上記を踏まえて
http://www.saturn.dti.ne.jp/~npaka/android/AnimeEx/index.html
のサンプルを見るとなんとな〜〜〜〜〜〜〜く分かる。


SurfeceViewマンドクセ('A`) けどAndroidでのOpenGLの描画もSurfeceViewを使うのでこの辺の知識まマストなんだよなあ。けどほんと情報が無い・・・iPhoneの方がコミュもあるし本もたくさん出てるし全然充実してるよ・・・調べるのだけで死んだ。仕方なく英語リファレンスと格闘。英語は話せなくていいから読めるようになりたい・・・。
LunarLanderのソース読みは続けます。やっぱSnakeの方がいいかなあ〜。

広告を非表示にする