android - GL 表面和可见性 : Gone

标签 android glsurfaceview

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

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

这似乎是一些图形缓冲区问题,但我没有找到解决这个问题的方法……有什么想法吗? 谢谢!

最佳答案

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

The surface is Z ordered so that it is behind the window holding its SurfaceView; the SurfaceView punches a hole in its window to allow its surface to be displayed. The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it

Android 有一个内置的窗口合成器(窗口在这里的含义有点不同)。你的状态栏是一个窗口,你的 Activity 有一个窗口。但是,如果您的 Activity 包含表面 View ,则会创建另一个窗口,仅用于保存表面,并且 android 合成器会在表面窗口上绘制带有您的 View 的窗口。所以 SurfaceView 实际上只是一个透明区域。当你隐藏它时,该区域不被绘制,不会对触摸使用react,但表面窗口仍然存在,android 不够聪明以隐藏窗口。

我会推荐两种解决方案

  • 使您的表面半透明。当您需要隐藏 View 时,您可以渲染空白表面(Android, Transparent sub-GLSurfaceView in layout?)
  • 从 View 层次结构中完全删除 View
  • 另一种有点 hacky 的方法是子类化 GLSurfaceView 并在可见性更改为 GONE 时调用 onDetachedFromWindow()。我没有对此进行测试,它可能无法正常工作。

关于android - GL 表面和可见性 : Gone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133690/

相关文章:

android - 有什么方法可以加快 Android 模拟器的速度

java - Double.parseDouble 丢失小数位

android - 在 Android 平板电脑上共享 2 个 GLSurfaceViews 之间的 EGL2.0 上下文导致 EGL_BAD_ACCESS

android - GLSURFACEVIEW 保存为 PNG - 错误 glReadPixels

android - 如何在 android 中的 glSurfaceView 之上构建 GUI/HUD

android - 使用 harism page curl 库的 Page Curl 效果,页面背景显示为黑色边框而不是透明度。

android - 同步两个 GLSurfaceViews

java - 什么是处理程序类?

android - 如何在baseAdapter 中使用sharedPreferences?

Android - 在 xml 中翻转图像