gpt4 book ai didi

android - SurfaceView 隐藏屏幕上的其他组件

转载 作者:行者123 更新时间:2023-12-04 23:52:53 32 4
gpt4 key购买 nike

我正在创建一个 FrameLayout 类型的布局,我在其中添加了两个 View 。两个 View 分别是 GLSurfaceView 和 SurfaceView 的对象。根据有关 SurfaceView 的 Android 开发者文档,

“表面是 Z 顺序的,因此它位于持有其 SurfaceView 的窗口后面;SurfaceView 在其窗口中打一个孔以显示其表面。”

它对我来说很好用,而且 SurfaceView 总是在我的 GLSurfaceView 后面(用于 opneGL 绘图)。但是在外部事件之后恢复,以下配置的行为很奇怪,

安卓版本:4.3设备型号:Nexus 7内核版本 3.4.0.g1f57c396月13日内部版本号:JWR66N

对于此配置,在外部事件后恢复会将我的 GLSurfaceView 置于 SurfaceView 后面。换句话说,SurfaceView 位于 ZOrder 的顶部,而我的 OpenGL 绘图不再可见。在高于 Android 4.3 的版本上,不会出现此行为。

我可以通过调用 SurfaceView 的以下方法并将 true 作为参数复制到所有版本。

void setZOrderOnTop

这是已知问题吗?有人可以帮我解决这个问题吗?

问候,苏梅德

最佳答案

SurfaceViews 有两个部分,Surface 和 View。 Surface 是一个完全独立的层。 View 在那里,所以 UI 布局代码可以使用。通常, View 只是透明的黑色,因此您可以看到它背后的任何东西。

GLSurfaceView 只是带有一些代码来管理 EGL 上下文和线程的 SurfaceView。在它下面只是一个 SurfaceView。因此,如果您同时拥有 SurfaceView 和 GLSurfaceView,并且它们具有相同的尺寸和 Z 顺序,那么它们中的一个将“赢”而另一个将“输”,因为它们试图占据相同的位置同时空间。没有明确的值会“获胜”,因此预期会出现不一致的行为。

避免冲突的一种方法是将一组保留为默认 Z,然后调用 setZOrderMediaOverlay()在另一。 “媒体覆盖”仍然在 UI 后面,但在默认的 Surface 位置之上。如果您使用 setZOrderOnTop() ,Surface 也将位于 UI 上方。

如果你想看到它后面的东西,上面的 Surface 需要用透明像素渲染(就像 View 需要透明才能看到 Surface)。

避免此问题的最有效方法是不出现此问题:对所有内容使用一个 SurfaceView,将所有非 UI 元素内容呈现给它。如果您要在其中一个 Surface 上渲染视频或显示相机预览,这需要更多的工作(可能还有 SurfaceTexture)。

您可以在 Grafika 中找到一些示例. “multi-surface exerciser”演示了三个在软件中呈现的重叠 SurfaceView,与 UI 元素重叠。其他 Activity 展示了使用 Surfaces、GLES、相机和视频的方法。

另见 Android System-Level Graphics Architecture doc,它更详细地解释了所有这些。

关于android - SurfaceView 隐藏屏幕上的其他组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27600961/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com