SurfaceView的缩放不一致的工作

时间:2014-12-24 13:46:53

标签: android scale surfaceview

我有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视频播放不流畅(锯齿状)而不是抗锯齿。

如何让它正常工作?请帮忙!

2 个答案:

答案 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(比例因子);

它会顺利运作