屏幕上的垂直条纹与SurfaceView顶部的VideoView

时间:2015-07-26 22:37:38

标签: android surfaceview android-videoview vitamio

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

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

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

删除VideoView后,条纹消失。但是,可以理解的是,在添加SurfaceView和从布局中删除VideoView之间的延迟时间大约是四分之一秒左右。在此期间,条纹清晰可见。

有什么方法吗?

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

2 个答案:

答案 0 :(得分:0)

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

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

如果在SurfaceView's canvas当前布局中同时显示VideoView,并且调用VideoView's start()方法而未调用{{1}通常会出现图形错误。

即使stopPlayback()已达到播放结束,仍必须调用VideoView以避免此图形错误。

编辑:请注意,即使拨打stopPlayback()setZOrderMediaOverlay(),也可能会出现这种情况。但是,如上所述,调用setZOrderOnTop()似乎可以解决问题。

答案 1 :(得分:0)

如文档中所述,VideoView是SurfaceView的子类。如果您尝试让两个SurfaceView同时占用相同的空间,则结果有些不可预测。 (好吧,我预测它们会很糟糕。)

如果您希望它们重叠,则需要将它们放在不同的Z深度。例如,您可以使用Canvas将SurfaceView上的setZOrderMediaOverlay()放在VideoView上方,但仍然位于View UI图层下方。

您需要确保基于Canvas的SurfaceView通常是透明的。有关具有三个重叠SurfaceView的示例,请参阅Grafika的“multi-surface test”。 drawCircleSurface()使用Canvas渲染。

其他详细信息可在graphics architecture document

中找到