【发布时间】:2014-04-29 10:34:50
【问题描述】:
在我的 Android 应用中,我需要使用以下 Z 顺序渲染三个视图:
- 在底部,覆盖整个屏幕的
MediaCodec解码器的输出表面。我的要求是我必须转换MediaCodec生成的图像(例如缩放它) - 在中间,
GLSurfaceView(或我定义的其他运行 GL 着色器的表面/视图),覆盖整个屏幕。显然,这一层中的一些像素将是透明的,以便看到下方的MediaCodec输出。 - 在顶部,任何其他视图 - 比如说
ImageView。不确定我是否需要这些最顶层视图的透明度,也许完全不透明的矩形视图是可以的 - 它们不会覆盖整个屏幕并且会四处移动。
看起来这是不可能的,但也许我遗漏了一些东西,或者有一种方法可以在较低级别上付出更多的努力(例如 EGL 上下文或类似的东西......我目前不明白) .
我无法让它工作并担心这是不可能的原因是:
- 对于底部
MediaCodec输出层(1),我必须能够转换图像。所以,我给 MediaCodec 渲染的表面必须来自TextureView - 为了能看穿中间的透明像素
GLSurfaceView(2),我不得不调用GLSurfaceView.setZOrderOnTop(true)。否则 GLSurfaceView 是不透明的。 - 但调用
GLSurfaceView.setZOrderOnTop(true)意味着在GLSurfaceView之上没有呈现其他视图(3)。例如。ImageView将始终出现在GLSurfaceView的不透明像素后面。
看起来调用 GLSurfaceView.setZOrderMediaOverlay(true) 而不是 GLSurfaceView.setZOrderOnTop(true) 旨在解决这个问题并促进这种类型的 Z 排序。如果最底部的MediaCodec 输出层是SurfaceView,它也会这样做。但我需要它是TextureView,这样我才能对其进行改造。当TextureView 下方有TextureView 时,GLSurfaceView.setZOrderMediaOverlay(true) 似乎不起作用:TextureView 被中间的GLSurfaceView 层完全遮挡,而不是透过透明像素显示。
这种 Z 排序是不可能的,对吗?还是可以通过搞乱 EGL 和上下文等来完成?
【问题讨论】:
标签: android surfaceview android-mediacodec textureview