Android SurfaceView导致屏幕闪烁

时间:2012-09-02 00:49:10

标签: android android-fragments surfaceview android-mediaplayer flicker

我正在研究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

更新:我现在通过覆盖setPrimaryItem()中的FragmentPagerAdapter方法调用删除SurfaceView的方法,找到了解决方法当视频播放器removeView()停止显示时,从层次结构(在LinearLayout容器上使用Fragment)开始,然后在SurfaceView再次激活时恢复{{1}}。不幸的是,当发生这种情况时仍然有点眨眼,所以如果有人有额外的想法,我将不胜感激!

1 个答案:

答案 0 :(得分:4)

来自Android Developers Blog

  

此小部件[SurfaceView]的工作原理是创建一个位于应用程序窗口后面的新窗口。然后它会在应用程序窗口中打出一个洞,以显示新窗口。

     

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

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