在我的 Android 应用程序中,我需要使用以下 Z 顺序渲染三个视图:
- 在底部,
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 和上下文等来完成?