8

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

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

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

4

1 回答 1

12

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

表面是 Z 顺序的,因此它位于持有其 SurfaceView 的窗口后面;SurfaceView 在其窗口中打了一个孔以显示其表面。视图层次结构将负责正确地将 SurfaceView 的任何兄弟姐妹与 Surface 合成,这些兄弟通常会出现在其顶部

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

我会推荐两种解决方案

  • 使您的表面半透明。然后,您可以在需要隐藏视图时渲染空表面(Android,布局中的透明子 GLSurfaceView?
  • 完全从视图层次结构中删除视图
  • 另一种有点 hacky 的方法是子类化GLSurfaceViewonDetachedFromWindow()在可见性更改为GONE. 我没有对此进行测试,它可能无法正常工作。
于 2012-08-26T21:03:53.353 回答