0

我正在编写一个显示过场动画的应用程序。目前,它的工作方式是(因为表面视图/视频视图通常不能相互叠加)我在应用程序运行时从布局中删除了 VideoView。然后,当我想显示过场动画时,我将 VideoView 添加回布局中,一旦动画准备好播放,删除 SurfaceView(如果操作正确,在视频开始之前没有“黑色闪光”。这个工作成功。)但是,当视频结束时,我可以做以下两件事之一:

  • 移除 VideoView,然后将 SurfaceView 添加回布局。这会导致在添加 SurfaceView 时屏幕上出现黑色闪烁。
  • 重新添加 SurfaceView,然后在 SurfaceView 准备好渲染后移除 VideoView。

同样,我选择了第二个选项来消除屏幕上的黑色闪光。但是,这会导致不同的问题。出于某种原因,在 VideoView 开始播放后,如果在其画布上添加 SurfaceView 的顶部,则会出现从上到下沿屏幕向下延伸的深色垂直条纹。

一旦 VideoView 被移除,条纹就会消失。然而,可以理解的是,在 SurfaceView 被添加回来和 VideoView 被从布局中删除之间大约有四分之一秒左右的延迟时间。在此期间,条纹清晰可见。

有没有办法解决?

请注意,我使用 Vitamio 来渲染 AVI 视频。

4

2 回答 2

0

经过一番思考和反复试验,我找到了解决方案。

它似乎是一个 android 或 Vitamio 错误。

如果在当前布局中还存在aSurfaceView's canvas时绘制了 a ,并且该方法在没有后续调用的情况下被调用,则通常会出现图形错误。VideoViewVideoView's start()stopPlayback()

即使VideoView已经到达其播放的结尾,stopPlayback()仍然必须调用以避免这种图形错误。

编辑:setZOrderMediaOverlay()请注意,即使调用or也可能发生这种情况setZOrderOnTop()。然而,如前所述,调用stopPlayback()似乎可以解决问题。

于 2015-07-27T00:43:51.783 回答
0

如文档中所述,VideoView 是 SurfaceView 的子类。如果你尝试让两个 SurfaceView 同时占据同一个空间,结果有些难以预料。(好吧,我预测他们会很糟糕。)

如果你想让它们重叠,你需要把它们放在不同的 Z 深度。例如,您可以setZOrderMediaOverlay()将 SurfaceView 与 Canvas 一起使用,将其置于 VideoView 之上,但仍位于 View UI 层之下。

您确实需要确保基于 Canvas 的 SurfaceView 通常是透明的。有关三个重叠 SurfaceView 的示例,请参阅 Grafika 的“多表面测试”。drawCircleSurface()使用画布渲染。

更多细节可以在图形架构文档中找到。

于 2015-07-27T15:54:36.943 回答