在我的 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)有一个时似乎不起作用:它被中间层完全遮挡,而不是通过透明像素显示。TextureViewTextureViewGLSurfaceView
这种 Z 排序是不可能的,这是否正确?还是可以通过搞乱 EGL 和上下文等来完成?