【问题标题】:SurfaceView's scaling inconsistent workSurfaceView 的缩放不一致的工作
【发布时间】:2018-02-24 19:05:46
【问题描述】:

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 视频播放不流畅(锯齿状)并且没有抗锯齿。

我怎样才能让它正常工作?请帮忙!

【问题讨论】:

    标签: android scale surfaceview


    【解决方案1】:

    SurfaceView 有两个部分,Surface 和 View。 setScale() 方法缩放 View 部分,但媒体播放器正在将内容发送到 Surface 部分。因为 View 只是一个透明窗口,所以您在不影响像素的情况下影响位置和帧大小。 TextureView 是这里的正确答案。

    您可能需要使用非整数比例因子(即setScaleX(1.001))来激发 TextureView 使用未经过滤的最近像素以外的纹理渲染方法。查看this question的答案。

    【讨论】:

      【解决方案2】:

      像相对布局一样在surfaceview上方添加一个透明视图,并在该透明视图上添加scalegesture检测器,当发生缩放时,只需在surfaceview上执行缩放。

      假设透明视图名为 videoview。

      Videoview.setOnClicklistner();
      

      当执行缩放时,将该比例因子实现为表面视图,例如 Surfaceview.setscaleX(比例因子); Surfaceview.setscaleY(比例因子);

      一切顺利

      【讨论】:

        猜你喜欢
        • 2014-11-05
        • 2015-07-24
        • 1970-01-01
        • 2011-11-27
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-17
        相关资源
        最近更新 更多