7

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

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

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

任何帮助,将不胜感激!

捷通

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

4

1 回答 1

4

来自Android 开发者博客

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

因为 SurfaceView 的内容不在应用程序的窗口中,所以不能有效地转换(移动、缩放、旋转)。这使得在 ListView 或 ScrollView 中使用 SurfaceView 变得困难。

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

于 2013-02-14T04:52:04.807 回答