2012-08-26 29 views
4

所以,我有我的应用程序一个GLSurfaceView由GLSurfaceView.Renderer被渲染并使用JPCt作为库。GL表面和可见性:飘

的表面是不可见的RelativeLayout(能见度:走)。当我将可见性更改为“可见”,然后返回“已离开”时,布局将按预期显示并隐藏,但GLSurfaceView不显示,只显示并不会隐藏,即使我可以单击现在的项目“后面”它。

好像有些图形缓冲区的问题,但我没有找到一个方法来得到这个工作...任何想法? 谢谢!

回答

8

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

表面是Z排序的,以便它在窗口后面保持其 SurfaceView; SurfaceView将在其窗口中打孔以允许显示其表面。视图层次结构将采取 照顾与表面正确合成通常会出现在它的上面

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

我会建议两种解决方案

  • 让你的表面半透明。然后,您可以当你需要隐藏视图(Android, Transparent sub-GLSurfaceView in layout?
  • 取下完全视图层次
  • 另一个有点哈克的方式是继承GLSurfaceView并调用onDetachedFromWindow()能见度变化时GONE视图渲染空面。我没有测试过它,它可能无法正常工作。
+1

谢谢你,真棒答案......我的解决方案#2去了! – arvere

+0

我使用了透明颜色的解决方案1。非常感谢 – Behnam

+1

另一种可能的答案是完全使其关闭屏幕,通过做沿着setX的东西线(view.getMeasuredWidth()),然后setX的(0)当你想回来在屏幕上。如果您不需要半透明的背景和/或您需要视图来正确测量(当未连接时您不会获得),这非常有用。 –