Android SurfaceView导致屏幕闪烁

Posted

技术标签:

【中文标题】Android SurfaceView导致屏幕闪烁【英文标题】:Android SurfaceView causing screen flicker 【发布时间】:2012-08-27 06:56:21 【问题描述】:

我正在开发适用于 android 的多媒体视频处理应用程序,但遇到了一些问题。我正在使用 FragmentPagerAdapter 类,其中包含许多不同的片段,用于视频处理的各个步骤。

我的第一个 Fragment 包含一个 SurfaceView 和一个 MediaPlayer ,以及各种播放控件。当我从片段 1(使用 SurfaceView)滑动到片段 2(此时为空)时,我的问题发生了。如果我还没有打电话给start(),则不会发生任何异常情况,并且我可以正常在片段之间滑动。但是,一旦我调用start(),当我滑动到下一个Fragment 时,整个屏幕就会开始闪烁,即使我已将MediaPlayer 置于空闲状态并且它没有向SurfaceView 提供帧。唯一能阻止这种情况的方法是通过滑动到第三个Fragment 来破坏表面以及包含视图,因此FragmentPagerAdapter 会破坏Fragment 一个,或者通过主页或后退按钮退出应用程序以便销毁视图。

我一生都无法弄清楚为什么会发生这种情况,除此之外,SurfaceView 渲染线程可能会以某种方式干扰主 UI 线程。 LogCat 上也没有出现任何异常,所以我有点卡住了。我正在运行一个带有 android 4.1 的 Galaxy Nexus 作为我的测试硬件。

任何帮助将不胜感激!

JT

更新:我现在设法通过覆盖FragmentPagerAdapter 中的setPrimaryItem() 方法来调用从层次结构中删除SurfaceView 的方法(使用@ 987654338@ 在其LinearLayout 容器上)当视频播放器Fragment 停止显示时,然后在SurfaceView 再次处于活动状态时恢复。不幸的是,发生这种情况时仍然有点眨眼,所以如果有人有其他想法,我将不胜感激!

【问题讨论】:

检查这个答案。您的问题与此类似:Link 【参考方案1】:

来自Android Developers Blog

这个小部件[SurfaceView] 通过在应用程序窗口后面创建一个新窗口来工作。然后它会在您的应用程序窗口上打一个洞以显示新窗口。

由于 SurfaceView 的内容不在应用程序的窗口中,因此无法有效地转换(移动、缩放、旋转)。这使得在 ListView 或 ScrollView 中使用 SurfaceView 变得很困难。

如果您正在构建 4.0 或更高版本,则解决方案是使用 TextureView。如果您有兴趣使用 TextureView 显示视频this thread 可能会有所帮助

【讨论】:

真棒答案....我花了 1 周的时间来解决这个问题.....终于删除了 SurfaceView/VideoView 并使用了 TextureView。

以上是关于Android SurfaceView导致屏幕闪烁的主要内容,如果未能解决你的问题,请参考以下文章

SurfaceView滚动时闪烁

SurfaceView 闪烁/撕裂

如何在Android中修复相机预览(surfaceview)的正确纵横比?

使用 SurfaceView 的 Android 游戏循环;快速更改相机“镜头”会导致黑色闪光等

利用SurfaceView显示正弦曲线,仿造示波器

SurfaceView 在加载时闪烁黑色