我有SurfaceView缩放问题。
我使用SurfaceView作为MediaPlayer的渲染器,并希望通过缩放surfaceView来制作不同的视频缩放模式:
switch(zoomMode) {
case 0:
surfaceView.setScaleX(1);
surfaceView.setScaleY(1);
break;
case 1:
surfaceView.setScaleX(16f / 12f);
surfaceView.setScaleY(16f / 12f);
break;
case 2:
surfaceView.setScaleX(12f / 16f);
surfaceView.setScaleY(12f / 16f);
break;
case 3:
surfaceView.setScaleX(1);
surfaceView.setScaleY(12f / 16f);
break;
case 4:
surfaceView.setScaleX(12f / 16f);
surfaceView.setScaleY(1);
break;
}
但是视频相当移动(1,2个案例)并且被裁剪(3,4个案例)而不是尺度。 在极少数情况下(不知道它取决于什么)它可以正常工作。
当我使用TextureView而不是SurfaceView时,缩放工作。但是使用TextureView视频播放不流畅(锯齿状)而不是抗锯齿。
如何让它正常工作?请帮忙!
答案 0 :(得分:0)
SurfaceView有两个部分,Surface和View。 setScale()
方法缩放了View部分,但媒体播放器正在向Surface部件发送内容。因为视图只是一个透明窗口,所以您会影响位置和帧大小而不会影响像素。 TextureView是正确的答案。
您可能需要使用非整数比例因子(即setScaleX(1.001)
)来激发TextureView使用除未过滤的最近像素之外的纹理渲染方法。请参阅this question的答案。
答案 1 :(得分:0)
在surfaceview上方添加一个透明视图,如相对布局,并在该透明视图上添加scalegesture探测器,当进行缩放时,只需在surfaceview上执行缩放。
让我们假设透明视图被命名为videoview。
Videoview.setOnClicklistner();
当执行缩放时,将scalefactor实现为surfaceview之类 Surfaceview.setscaleX(比例因子); Surfaceview.setscaleY(比例因子);
它会顺利运作