GL Surface和可见性:消失了

8

我在我的应用程序中使用GLSurfaceView和GLSurfaceView.Renderer以及JPCt库进行渲染。

该视图位于一个不可见的RelativeLayout中(visibility: gone)。当我将可见性更改为“visible”,然后再更改回“gone”时,布局按预期显示和隐藏,但GLSurfaceView却没有隐藏,它只是显示着,并且无法隐藏,尽管我可以点击现在“在它后面”的项目。

这似乎是一些图形缓冲区问题,但我没有找到解决方法...有什么想法吗? 谢谢!

1个回答

14

SurfaceView(以及其扩展的GLSurfaceView)在Android中是非常特殊的存在。来自Android文档的引用:

这个表面被Z顺序排序,使得它位于持有其SurfaceView的窗口后面;SurfaceView在其窗口中打一个洞,以允许显示其表面。视图层次结构将负责正确地合成与SurfaceView的任何同级的Surface,这些Surface通常会出现在它的前面。

Android具有内置的窗口合成器(此处“窗口”有点不同的意思)。您的状态栏是一个窗口,您的活动有一个窗口。但是,如果您的活动包含一个SurfaceView,则会创建另一个窗口,仅用于保持表面,android合成器会把您的视图绘制在表面窗口之上。因此,SurfaceView实际上只是一个透明区域。当您隐藏它时,该区域不会被绘制,也不会对触摸作出反应,但是表面窗口仍然存在,android不聪明到足以隐藏窗口。

我建议两种解决方案

  • 使您的表面半透明。然后,在需要隐藏视图时渲染空表面(Android,透明子GLSurfaceView在布局中?
  • 从视图层次结构中完全删除该视图
  • 另一种有点诡异的方法是子类化GLSurfaceView并在可见性更改为GONE时调用onDetachedFromWindow()。我还没有测试过这个方法,也许行不通。

我使用了方案1,通过渲染透明颜色来实现。非常感谢。 - Behnam
3
另一个可能的答案是将其完全渲染到屏幕之外,可以通过类似于 setX(view.getMeasuredWidth()) 的方式实现,然后在想要重新显示时再将其设置为 setX(0)。如果您不想要半透明背景和/或需要正确测量视图(当未附加视图时,您将无法获取它),则此方法非常有用。 - David Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接