ページ

2013年7月31日水曜日

AndroidのSurfaceViewの仕様について

Androidでゲーム用などの高速描画を行いたいときに、描画スレッドを持ったViewであるSurfaceViewを使いたい時があると思います。
この前、SurfaceViewの仕様でハマったことがあったのでメモ目的でここに書き留めておきます。

直接setContentViewしないと、unlockCanvasAndPostしても画面が更新されない

最初にSurfaceViewを利用しようとした時、SurfaceViewを継承したクラスをレイアウトxmlに配置していました…

<jp.blogspot.mohammedari.hoge.MySurfaceView
     android:id="@+id/my_surface_view"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>

こんな感じで。
すると、SurfaceViewの描画スレッドで

surfaceHolder.unlockCanvasAndPost(canvas);

としても、画面が更新されない現象に遭遇しました…
機種はXperia SX、Android4.1.2で再現しています。
※ただし、drawメソッドをオーバーライドするとViewが配置された最初の一回だけ描画が行われるようです。

この現象は、xmlで指定せずに、コードで直接SurafaceViewをsetContentView刷ることで解決しました。

SurfaceViewの上に他のコントロールを配置すると落ちる

自分の想定していた使い方としては、高速で書き換えの必要なUIをSurfaceViewで作って、他のコントロールと合わせて表示したいというものでした。
しかし、SurfaceViewの上に他のコントロールを配置すると、実行時に落ちます

どうやら、SurfaceViewはそのような使い方を想定して作られたものではないようです。
結局、SurfaceViewを諦めてViewを継承したクラスを作成し、Activity側のパラメータ更新に合わせてpostInvalidateするように変更しました。

端末の性能にも依存するとは思いますが、10fps程度の描画なら十分これで追いつくようです。

0 件のコメント:

コメントを投稿