私の Android アプリでは、次の Z オーダーで 3 つのビューをレンダリングする必要があります。
- 下部には、
MediaCodec
画面全体をカバーするデコーダーの出力面があります。によって生成された画像を変換する必要があるという要件がありますMediaCodec
(たとえば、スケーリングする) - 中央には、
GLSurfaceView
(または私が定義した GL シェーダーを実行している他のサーフェス/ビュー) が画面全体をカバーしています。MediaCodec
明らかに、このレイヤーの一部のピクセルは、下の出力を見るために透明になります。 - その上に、他のビュー - と言う
ImageView
。これらの最上部のビューに透明性が必要かどうかはわかりませんが、おそらく完全に不透明な長方形のビューで問題ありません。画面全体をカバーするわけではなく、移動します。
これは不可能のように見えますが、何かが欠けているか、より低いレベルでより多くの努力を払ってそれを行う方法がある可能性があります (たとえば、EGL コンテキストなど... 現在理解していません)。
これを機能させることができず、不可能ではないかと心配している理由は次のとおりです。
- 一番下の
MediaCodec
出力レイヤー (1) では、画像を変換できる必要があります。したがって、レンダリングする MediaCodec に指定するサーフェスは、TextureView
GLSurfaceView
中央(2)の透明なピクセルを通して見ることができるようにするには、を呼び出す必要がありますGLSurfaceView.setZOrderOnTop(true)
。それ以外の場合、GLSurfaceView は不透明です。- ただし、呼び出し
GLSurfaceView.setZOrderOnTop(true)
は、他のビュー (3) が の上にレンダリングされないことを意味しますGLSurfaceView
。たとえば、ImageView
は常に の不透明なピクセルの後ろに表示されGLSurfaceView
ます。
呼び出しGLSurfaceView.setZOrderMediaOverlay(true)
の代わりに、GLSurfaceView.setZOrderOnTop(true)
これに対処し、このタイプの Z オーダーを容易にすることを意図しているようです。そして、最下層のMediaCodec
出力レイヤーがSurfaceView
. しかし、私はそれをTextureView
変換できるようにする必要があります。その下にGLSurfaceView.setZOrderMediaOverlay(true)
がある場合は機能しないようです。透明なピクセルを通して表示されるのではなく、中間レイヤーによって完全に隠されています。TextureView
TextureView
GLSurfaceView
この Z オーダーは不可能であるというのは正しいですか? それとも、EGL やコンテキストなどをいじることで実現できますか?