7

我正在开发面向Android的多媒体视频处理应用程序,并且遇到了一些问题。我正在使用FragmentPagerAdapter类,其中有许多不同的片段用于各种视频处理步骤。Android SurfaceView导致屏幕闪烁

我的第一个Fragment包含SurfaceViewMediaPlayer,它连同各种播放控件一起提供它。当我从片段1(使用SurfaceView)滑动到片段2(此时为空)时,发生了我的问题。如果我还没有叫start(),没有什么不寻常的事情发生,我可以正常地在片段之间滑动。但是,一旦我拨打start(),即使我已将MediaPlayer置于空闲状态,并且不会将帧传送到SurfaceView,但当我滑动到下一个Fragment时,整个屏幕开始闪烁。唯一能够阻止这种情况的方法是通过滑动到第三个Fragment以使Fragment破坏Fragment,或者通过home或back按钮退出应用程序以销毁视图。

我不能为我的生活弄清楚为什么会发生这种情况,除此之外也许SurfaceView渲染线程以某种方式干扰主UI线程。 LogCat上也没什么不寻常的,所以我有点卡住了。我使用android 4.1运行Galaxy Nexus作为我的测试硬件。

任何帮助,将不胜感激!

JT

更新:我设法找到一个解决办法,现在通过覆盖在FragmentPagerAdaptersetPrimaryItem()方法来调用从层次结构中删除SurfaceView的方法(在其LinearLayout容器使用removeView())当视频播放器Fragment停止显示时,然后在其再次激活时恢复SurfaceView。不幸的是,当这种情况发生时,仍然有点眨眼,所以如果有人有其他想法,我会很感激!

+0

检查这个答案。你的问题是这样的:[链接](http://stackoverflow.com/questions/8772862/surfaceview-flashes-black-on-load) – RATHI

回答

4

Android Developers Blog

这个小工具[SurfaceView]通过创建放置应用程序的窗口后面的新窗口。然后在应用程序窗口中打出一个洞来显示新窗口。

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

解决方案是使用一个TextureView,如果你正在建造4.0或以上。如果你有兴趣使用TextureView来显示视频this thread可能有帮助

+0

真棒答案....我花了我1周解决这个问题。 ....最后删除了SurfaceView/VideoView并使用了TextureView。 –