この前、SurfaceViewの仕様でハマったことがあったのでメモ目的でここに書き留めておきます。
直接setContentViewしないと、unlockCanvasAndPostしても画面が更新されない
最初にSurfaceViewを利用しようとした時、SurfaceViewを継承したクラスをレイアウトxmlに配置していました…
こんな感じで。
すると、SurfaceViewの描画スレッドで
としても、画面が更新されない現象に遭遇しました…
機種はXperia SX、Android4.1.2で再現しています。
※ただし、drawメソッドをオーバーライドするとViewが配置された最初の一回だけ描画が行われるようです。
この現象は、xmlで指定せずに、コードで直接SurafaceViewをsetContentView刷ることで解決しました。
<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程度の描画なら十分これで追いつくようです。
しかし、SurfaceViewの上に他のコントロールを配置すると、実行時に落ちます…
どうやら、SurfaceViewはそのような使い方を想定して作られたものではないようです。
結局、SurfaceViewを諦めてViewを継承したクラスを作成し、Activity側のパラメータ更新に合わせてpostInvalidateするように変更しました。
端末の性能にも依存するとは思いますが、10fps程度の描画なら十分これで追いつくようです。
0 件のコメント:
コメントを投稿