GL表面和可见性:已经消失

时间:2012-08-26 20:35:57

标签: android glsurfaceview

所以我的应用程序中有一个GLSurfaceView由GLSurfaceView.Renderer呈现并使用JPCt作为库。

表面处于不可见的RelativeLayout(可见性:已消失)。当我将可见性更改为“可见”然后再返回“已消失”时,布局会按预期显示和隐藏,但GLSurfaceView不显示,它只显示并且不会隐藏,即使我可以单击现在的项目“背后”它。

这似乎是一些图形缓冲区问题,但我没有找到办法让这个工作......任何想法? 谢谢!

1 个答案:

答案 0 :(得分:11)

SurfaceView(以及GLSurfaceView扩展名)是Android中的有趣野兽。来自Android javadoc的引文:

  

表面是Z排序的,因此它位于窗口后面   SurfaceView; SurfaceView在其窗口中打孔以允许它   表面要显示。视图层次结构将负责   正确地与Surface合成SurfaceView的任何兄弟   通常会出现在它上面

Android有一个内置的窗口合成器(窗口在这里有一点不同的含义)。您的状态栏是一个窗口,您的活动有一个窗口。但是如果你的活动包含一个表面视图,那么就会创建另一个窗口,只是为了保持表面,而android compositor会在窗口中绘制你的视图。所以SurfaceView实际上只是一个透明的区域。当你隐藏它时,区域不会被绘制,不会对触摸作出反应,但表面窗口仍然存在,android不够聪明,无法隐藏窗口。

我会推荐两种解决方案

  • 让您的表面半透明。然后,当您需要隐藏视图(Android, Transparent sub-GLSurfaceView in layout?
  • 时,可以渲染空表面
  • 完全从视图层次结构中删除视图
  • 另一种有点hacky方式是子类GLSurfaceView并在可见性更改为onDetachedFromWindow()时调用GONE。我没有对此进行测试,但可能无效。