为什么在Fragment中的SurfaceView在Fragment被隐藏时仍然可见?

3

一个普遍的问题:我有一个包含SurfaceView的Fragment。当我通过FragmentManager隐藏该Fragment时,SurfaceView仍然可见。

我找到了一个解决方法,只需在隐藏/显示Fragment时将View设置为INVISIBLE / GONE / VISIBLE-但我想知道:为什么SurfaceView仍然显示?是因为SurfaceView基本上是一个“打孔”,这意味着它不在Fragment的Layout-Hierarchy中,因此无法在Layout隐藏时隐藏吗?

隐藏过程对Fragment做了什么?它只是将创建的视图设置为消失吗?

1个回答

4
一个SurfaceView创建了一个完全独立的图像层,并由系统组合起来。 "孔洞"包括在视图层次结构中,因此布局出现正确。 在涉及SurfaceView时,有很多东西不太正常。相比之下,TextureView实际上是View本身的一部分,并且会行为适当。 缺点是需要将像素从离屏缓冲区复制到视图中。 GPU执行此操作,因此速度非常快,但是如果尝试以60fps动画显示屏幕的大部分内容或在播放全长电影时最小化电池耗电量,则SurfaceView可能是更好的选择。 如果可以使用TextureView,那么这样做可能会使您的生活变得更简单。

谢谢您的回复!我会使用TextureView,但据我所知,Android Api > 8尚未提供“GLTextureView”(好吧,可能有一些开源的,但我宁愿坚持“经过测试”的代码)。 - Frame91
啊。直到API 14,根本没有TextureView可用,因此如果您需要在2.x上运行,则不是一个选项。根据http://developer.android.com/about/dashboards/index.html,通过针对较旧的API级别进行定位,您可能会获得另外约23%的用户。 - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接