我在我的应用程序中使用GLSurfaceView和GLSurfaceView.Renderer以及JPCt库进行渲染。
该视图位于一个不可见的RelativeLayout中(visibility: gone)。当我将可见性更改为“visible”,然后再更改回“gone”时,布局按预期显示和隐藏,但GLSurfaceView却没有隐藏,它只是显示着,并且无法隐藏,尽管我可以点击现在“在它后面”的项目。
这似乎是一些图形缓冲区问题,但我没有找到解决方法...有什么想法吗? 谢谢!
我在我的应用程序中使用GLSurfaceView和GLSurfaceView.Renderer以及JPCt库进行渲染。
该视图位于一个不可见的RelativeLayout中(visibility: gone)。当我将可见性更改为“visible”,然后再更改回“gone”时,布局按预期显示和隐藏,但GLSurfaceView却没有隐藏,它只是显示着,并且无法隐藏,尽管我可以点击现在“在它后面”的项目。
这似乎是一些图形缓冲区问题,但我没有找到解决方法...有什么想法吗? 谢谢!
SurfaceView
(以及其扩展的GLSurfaceView
)在Android中是非常特殊的存在。来自Android文档的引用:
这个表面被Z顺序排序,使得它位于持有其SurfaceView的窗口后面;SurfaceView在其窗口中打一个洞,以允许显示其表面。视图层次结构将负责正确地合成与SurfaceView的任何同级的Surface,这些Surface通常会出现在它的前面。
Android具有内置的窗口合成器(此处“窗口”有点不同的意思)。您的状态栏是一个窗口,您的活动有一个窗口。但是,如果您的活动包含一个SurfaceView,则会创建另一个窗口,仅用于保持表面,android合成器会把您的视图绘制在表面窗口之上。因此,SurfaceView
实际上只是一个透明区域。当您隐藏它时,该区域不会被绘制,也不会对触摸作出反应,但是表面窗口仍然存在,android不聪明到足以隐藏窗口。
我建议两种解决方案
GLSurfaceView
并在可见性更改为GONE
时调用onDetachedFromWindow()
。我还没有测试过这个方法,也许行不通。