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

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

我会推荐两种解决方

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...