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

arv*_*ere 7 android glsurfaceview

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

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

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

rka*_*apl 11

SurfaceView(并且GLSurfaceView通过扩展)是Android中有趣的野兽.来自Android javadoc的引文:

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

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

我会推荐两种解决方案

  • 让你的表面半透明.然后,当您需要隐藏视图时,可以渲染空表面(Android,透明子GLSurfaceView在布局中?)
  • 完全从视图层次结构中删除视图
  • 另一种有点hacky方式是在可见性更改时进行子类化GLSurfaceView和调用.我没有测试过它,它可能无法正常工作.onDetachedFromWindow()GONE

  • 另一个可能的答案是通过沿着setX(view.getMeasuredWidth())的方式执行某些操作,然后在屏幕上将其重新设置为setX(0)时,将其完全关闭.如果您不想要半透明背景和/或您需要正确测量视图(在未附加时将无法获得),这将非常有用. (2认同)