Android GL曲面和可见性:消失

Android GL曲面和可见性:消失,android,glsurfaceview,Android,Glsurfaceview,因此,我的应用程序中有一个GLSurfaceView,由GLSurfaceView.Renderer渲染,并使用JPCt作为库 曲面处于不可见的相对位置(可见性:消失)。当我将可见性更改为“可见”,然后再更改为“消失”时,布局将按预期显示和隐藏,但GLSURFACHEVIEW不显示,它只是显示,不会隐藏,即使我可以单击现在位于其“后面”的项目 这似乎是一些图形缓冲区的问题,但我没有找到一种方法让它工作。。。有什么想法吗? 谢谢 SurfaceView(扩展为GLSurfaceView)是安卓系统

因此,我的应用程序中有一个GLSurfaceView,由GLSurfaceView.Renderer渲染,并使用JPCt作为库

曲面处于不可见的相对位置(可见性:消失)。当我将可见性更改为“可见”,然后再更改为“消失”时,布局将按预期显示和隐藏,但GLSURFACHEVIEW不显示,它只是显示,不会隐藏,即使我可以单击现在位于其“后面”的项目

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

SurfaceView
(扩展为
GLSurfaceView
)是安卓系统中有趣的野兽。来自Android javadoc的引文:

曲面是Z有序的,因此它位于保持其形状的窗口后面 表面观察;SurfaceView在其窗口上打了一个孔,以允许 要显示的曲面。视图层次结构将负责 与曲面正确合成SurfaceView的任何同级 这通常会出现在它上面

Android有一个内置的窗口合成器(窗口在这里有点不同的含义)。您的状态栏是一个窗口,您的活动只有一个窗口。但如果您的活动包含曲面视图,则会创建另一个窗口(仅用于保存曲面),android compositor会在曲面窗口上使用您的视图绘制窗口。因此,
SurfaceView
实际上只是一个透明区域。当您隐藏它时,该区域不会被绘制,不会对触摸做出反应,但曲面窗口仍然存在,android不够聪明,无法隐藏窗口

我建议两种解决办法

  • 使你的表面半透明。然后,当需要隐藏视图()时,可以渲染空曲面
  • 从视图层次结构中完全删除视图
  • 另一种有点老套的方法是将
    GLSurfaceView
    子类化,并在可见性更改为
    GONE
    时调用
    onDetachedFromWindow()
    。我没有测试过这个,它可能不起作用

我通过渲染透明颜色来使用解决方案1。其他可能的答案是完全在屏幕外渲染它,方法是沿setX(view.getMeasuredWidth())执行操作,然后在希望它返回屏幕时执行setX(0)。如果您不想要半透明背景和/或需要正确测量视图(未附加视图时无法获得),此选项非常有用。