所以我的应用程序中有一个 GLSurfaceView 由 GLSurfaceView.Renderer 渲染并使用 JPCt 作为库。
表面处于不可见的 RelativeLayout(可见性:消失)中。当我将可见性更改为“可见”然后返回“已消失”时,布局会按预期显示和隐藏,但 GLSurfaceView 不会,它只会显示并且不会隐藏,即使我可以单击现在的项目“背后”。
这似乎是一些图形缓冲区问题,但我没有找到让它工作的方法......有什么想法吗?谢谢!
所以我的应用程序中有一个 GLSurfaceView 由 GLSurfaceView.Renderer 渲染并使用 JPCt 作为库。
表面处于不可见的 RelativeLayout(可见性:消失)中。当我将可见性更改为“可见”然后返回“已消失”时,布局会按预期显示和隐藏,但 GLSurfaceView 不会,它只会显示并且不会隐藏,即使我可以单击现在的项目“背后”。
这似乎是一些图形缓冲区问题,但我没有找到让它工作的方法......有什么想法吗?谢谢!
SurfaceView
(以及GLSurfaceView
扩展)是 Android 中有趣的野兽。来自 Android javadoc 的引用:
表面是 Z 顺序的,因此它位于持有其 SurfaceView 的窗口后面;SurfaceView 在其窗口中打了一个孔以显示其表面。视图层次结构将负责正确地将 SurfaceView 的任何兄弟姐妹与 Surface 合成,这些兄弟通常会出现在其顶部
Android 有一个内置的窗口合成器(这里的窗口有一点不同的含义)。您的状态栏是一个窗口,您的活动有一个窗口。但是,如果您的活动包含表面视图,则会创建另一个窗口,只是为了保持表面,并且 android compositor 会在表面窗口上绘制带有您的视图的窗口。所以这SurfaceView
实际上只是一个透明区域。当你隐藏它时,该区域不会被绘制,不会对触摸做出反应,但表面窗口仍然存在,android 不够聪明地隐藏窗口。
我会推荐两种解决方案
GLSurfaceView
并onDetachedFromWindow()
在可见性更改为GONE
. 我没有对此进行测试,它可能无法正常工作。