2つ以上のSurfaceViewの切り替え

SurfaceViewは普通のビューとは違った仕組みで動いています。

ここではSurfaceViewの切り替えについてはまったことをメモしておきたいと思います。

SurfaceViewの仕組み

初めにSurfaceViewと普通のビューは異なり、次の違いがあります。

アプリから独立して描画されるということは普通のビューはアプリのサーフェイス(描画に使われる面)に描画されているのに対し、SurfaceViewはそれ単体で新しいサーフェイスが作られるということです。

だから2つ以上のSurfaceViewがあると2つのサーフェイスが同時に存在しているのでどちらか一方だけ描画されることになります。

結論 : 切り替えできない

では2つのSurfaceViewがあるとき、どうやって切り替えればいいか調べるとここに詳しい回答が載っていました。

このサイトではSurfaceViewとその他のビューは次の順序で描画されると書かれています。

SurfaceViewとそのほかのビューの描画順序

この図を見るとSurfaceView同士の優先度を切り替えるのにsetZOrderOverlayを使えます。

例えば次のような感じで2つのサーフェイスビューを切り替えできそうな気がします。

SurfaceView surfaceView1 = new SurfaceView(this);
    ///ビュー1
SurfaceView surfaceView2 = new SurfaceView(this);
    ///ビュー2

// ...

surfaceView1.setZOrderMediaOverlay(true);
    ///ビュー1をビュー2の前に描画

しかし、実際試してみると1回目は上手くいくのにそれ以降が切り替えできないことがわかりました。

なぜかというとsetZOrderMediaOverlayを設定したSurfaceView同士のどちらが先に描画されるかは実際に実行してみないと分からないからです。

まとめ

このようにSurfaceViewの優先度は設定できないのでゲームなどのアプリではSurfaceViewは1つにしておいた方が良いと思います。

もしどうしても2つ以上を使いたいならActivityごとにSurfaceViewを使うしかないみたいです...

では、また!

関連項目
プライバシーポリシー