当SurfaceView被缩放时,视频不会按比例缩放。

6
我正在SurfaceView中播放视频。当我缩放SurfaceView时,它的坐标被正确地缩放,但正在播放的视频内容却没有缩放。
我使用ViewHelper.setScaleX方法来缩放视图。我尝试了很多方法,但无法缩放视频。如果我更改参数,则视频可以正确地缩放。但这会使过渡变慢。请看初始视频和缩放后的最终视频的快照。
初识视频(surface view scale为1): initial video with surface view scale 1 SurfaceView缩放后的视频(见右下角): video after surfaceView is scaled. See at the bottom-right

2
如果我改变参数,那么哪些参数? - pskink
视图的LayoutParams,更改视图的宽度和高度。 - sanjeev
有关调整SurfaceView表面大小的示例,请参见Grafika中的AspectFrameLayout(https://github.com/google/grafika/blob/master/src/com/android/grafika/AspectFrameLayout.java)。它在那里用于调整大小以匹配视频播放的纵横比,但应该是可适应的。 - fadden
4个回答

1
在SurfaceView上添加一个透明视图,类似于相对布局,并在该透明视图上添加ScaleGestureDetector,在缩放发生时,只需在SurfaceView或TextureView上执行该缩放。假设透明视图的名称为“videoview”。
Videoview.setOnClicklistner();

当进行缩放时,将scalefactor应用于surfaceview,如下所示:
Surfaceview.setscaleX(scalefactor);
Surfaceview.setscaleY(scalefactor);

它将会平稳运行


嘿,setScale方法始终以中心点为缩放中心,有没有办法将其更改为屏幕焦点的中心点? - Anjani Mittal

1
我已经解决了。使用TextureView而不是SurfaceView。SurfaceView上的动画无法运行。使用此链接使用textureView播放视频:在TextureView上播放视频

1
注意,TextureView 会消耗比 SurfaceView 更多的电池,因为它使用 openGL 绘制视频,而 SurfaceView 可以使用硬件叠加层(如果可用)。
正如其他评论中的人所说,您可以通过修改视图的 layoutParams 来实现您想要的效果。

1
layoutParams 相比 setScale... 消耗更多的 CPU,因此动画的帧率非常低。 - oleynikd

0

如果你必须使用SurfaceView,因为你正在使用第三方库或其他原因,一个解决方法是使用缩放动画将其缩小,并在动画完成后通过更新SurfaceView的layoutparams来给出正确的大小和位置。这并不完美,但对于那些没有其他选择的人来说应该还不错。


你还需要将比例设置回 1,否则视图将显示为由布局参数设置的正确宽度/高度,但在动画之后缩放到设置的比例。 - Giulio Piancastelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接