いやまぁ仕様なんですけど、気が付くのに1時間以上掛かってしまったので、メモ(´・ω・`)
とりあえず結論
端的に言えば、SurfaceViewやSurfaceViewを継承したクラス(GLSurfaceViewとか)を使う時に、backgroundに不透明な色やdrawableを割り当てるのは駄目、と言う事で。
過程
事の起こりは
特に深い意味は無かったんですけど、レイアウトファイルでSurfaceViewの背景色をandroid:backgroundで割り当てていました。とある事情でViewのスクリーン上での位置とサイズが欲しかっただけなのですが、わかりやすいようにと思って。元々の目的は果たしたので別のテスト用にそこに描画しようとした所・・・おっかしいなぁ一所懸命描画しているはずなのに、画面では一向に変わらない(;_;)
native側での描画なのでなんか間違ったんかなぁと一時間ほど悩んでしまいました。
でようやく気付きました
と言うか、SurfaceView様の事情を思い出しました。
以前の記事で、TextureViewに枠を付けた〜い(^o^)/ってのを書いたのを見られた方もいると思いますが、あの記事の最初に載せているxmlで定義したShapeDrawableをSurfaceViewに割り当てるとやっぱり表示が見えなくなるのです。
要はSurfaceViewとその下位クラスでは、backgroundに色や画像を割り当てていると、Surfaceへの描画内容よりも上にbackgroundが表示されるのでした。
backgroundなのにforeground風に描画されるなんてひどい(T_T)
ちなみに、SurfaceView様はと言うと、SurfaceViewに相当する位置を透過するようにまるっとくり抜いてViewの後ろにあるwindowが見えるようにすることで、Viewとして描画をバイパスして高速に描画できるようにしているだけなので、せっかくくり抜いていたViewをbackgroundで塗りつぶしちゃ表示が見えんくなって当然やんと申しておりました。たぶん。
通常のViewだと、上から順に
- Viewの表示内容 > Viewの背景
と重なっているのが、SurfaceViewの場合には
- Viewの表示内容(無し) > Viewの背景(指定しなければ透過) > Surfaceへの描画内容
となっているって事ですね。SurfaceViewを2枚重ねるともっと大変なことが・・・
これは、SurfaceViewの描画の仕組みを知ってればなんて事はない罠でしたね。
昔書きましたが、SurfaceView様の本当の罠は別のところにあります。
と言う事でおしまいです。
お疲れ様でした。