我正在创建一个 FrameLayout 类型的布局,在其中添加两个视图。两个视图分别是GLSurfaceView和SurfaceView的对象。根据有关 SurfaceView 的 Android 开发人员文档,
“表面是 Z 排序的,因此它位于容纳 SurfaceView 的窗口后面;SurfaceView 在其窗口中打孔以允许显示其表面。”
它对我来说效果很好,SurfaceView 总是落后于我的 GLSurfaceView(用于 openGL 绘图)。但在外部事件后恢复,以下配置的行为很奇怪,
安卓版本:4.3
设备型号:Nexus 7
内核版本3.4.0.g1f57c39
6月13日
内部版本号:JWR66N
对于此配置,外部事件后恢复会将我的 GLSurfaceView 置于 SurfaceView 后面。换句话说,SurfaceView 位于 ZOrder 的顶部,并且我的 OpenGL 绘图不再可见。在 Android 4.3 以上的版本中,不会出现此行为。
我可以通过使用 true 作为参数调用 SurfaceView 的以下方法,在所有版本上复制此行为。
无效 setZOrderOnTop
这是已知问题吗?有人可以帮我解决这个问题吗?
问候,
苏梅德
SurfaceView 有两部分:Surface 和 View。 Surface 是一个完全独立的层。视图就在那里,因此 UI 布局代码可以使用。通常,视图只是透明的黑色,因此您可以看到其后面的任何内容。
GLSurfaceView 只是 SurfaceView,带有一些管理 EGL 上下文和线程的代码。下面只是一个 SurfaceView。因此,如果您同时拥有 SurfaceView 和 GLSurfaceView,并且它们具有相同的尺寸和 Z 顺序,那么其中一个将“获胜”,另一个将“失败”,因为它们试图占据相同的位置同时空间。没有明确的“获胜”价值,因此不一致的行为是意料之中的。
避免冲突的一种方法是将一组保留为默认 Z,然后调用setZOrderMediaOverlay() http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderMediaOverlay(boolean)在另一。 “媒体覆盖层”仍然位于 UI 后面,但位于默认 Surface 位置之上。如果你使用setZOrderOnTop() http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderOnTop(boolean),Surface 也将位于 UI 上方。
如果您想看到其后面的东西,则需要使用透明像素渲染上层 Surface(与视图需要透明才能看到 Surface 的方式相同)。
避免此问题的最有效方法是不出现此问题:使用一个 SurfaceView 处理所有事情,将所有非 UI 元素内容渲染到它。这需要更多的工作(可能还需要表面纹理 http://developer.android.com/reference/android/graphics/SurfaceTexture.html)如果您正在渲染视频或在其中一个表面上显示相机预览。
您可以在以下位置找到一些示例Grafika https://github.com/google/grafika. The "多表面锻炼器 https://github.com/google/grafika/blob/master/src/com/android/grafika/MultiSurfaceActivity.java”演示了在软件中渲染的三个重叠的 SurfaceView,与 UI 元素重叠。其他活动展示了使用 Surface、GLES、相机和视频的方法。
另请参阅 Android系统级图形架构 https://source.android.com/devices/graphics/architecture.htmldoc,它更详细地解释了这一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)