代码之家  ›  专栏  ›  技术社区  ›  arvere

GL表面和可见性:消失

  •  8
  • arvere  · 技术社区  · 12 年前

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

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

    这似乎是一些图形缓冲区的问题,但我没有找到一种方法来实现这一点。。。有什么想法吗? 谢谢

    1 回复  |  直到 12 年前
        1
  •  14
  •   Community Justin Hirsch    7 年前

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

    曲面是Z有序的,因此它位于保持其 表面视图;SurfaceView在其窗口中冲压一个孔,以允许 要显示的表面。视图层次结构将处理 与曲面正确合成SurfaceView的任何同级 通常会出现在它上面

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

    我推荐两种解决方案

    • 使表面半透明。然后,当需要隐藏视图时,可以渲染空曲面( Android, Transparent sub-GLSurfaceView in layout? )
    • 从视图层次结构中完全删除视图
    • 另一个有点技巧的方法是子类 GL表面视图 然后打电话 onDetachedFromWindow() 当可见性更改为 GONE 。我还没有对此进行测试,它可能不起作用。