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导致屏幕闪烁的主要内容,如果未能解决你的问题,请参考以下文章
如何在Android中修复相机预览(surfaceview)的正确纵横比?