【问题标题】:Cannot scale or flip surfaceview matrix无法缩放或翻转表面视图矩阵
【发布时间】:2014-03-05 10:42:53
【问题描述】:

我正在制作一个相机应用程序。我使用 SurfaceView 来显示我的相机预览。

        preview=(SurfaceView)findViewById(R.id.preview);
        previewHolder=preview.getHolder();
        previewHolder.addCallback(surfaceCallback);
        previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        Matrix m = preview.getMatrix();
         m.setScale(-1,1);

我想要做的是翻转 SurfaceView 矩阵。我尝试使用 preScale() 和 postScale(),并尝试将最后 2 行添加到 Surfaceview.callback 方法,如下所示:

   public void surfaceChanged(SurfaceHolder holder, int format,
                                   int width, int height) {                     
          initPreview(width, height);
          startPreview();
Matrix m = preview.getMatrix();
         m.setScale(-1,1);
                  }

但我到处都遇到相同的错误(以及应用程序崩溃):

java.lang.IllegalStateException: Matrix can not be modified

我做错了什么?是否可以改变 SurfaceView 的比例?如果没有,还有其他方法可以翻转相机预览吗?

【问题讨论】:

  • 如果你想进入 OpenGL ES,你可以做各种各样的事情(例如,参见 github.com/google/grafika 中的“显示 + 捕获相机”)。不过,这确实增加了很多复杂性。

标签: android matrix android-camera surfaceview


【解决方案1】:

为了澄清 Madhusudan 几个月前发布的答案,您必须使用 set() 对 Matrix 进行深层复制,而不是创建一个空白矩阵然后将其设置为等于您的预览矩阵。

看起来像这样:

Matrix m = new Matrix(preview.getMatrix());
m.postRotate(90.0f);
canvas.drawBitmap(bitmap, m, NULL);

或者是这样的:

Matrix m = new Matrix();
m.set(preview.getMatrix());
m.postRotate(90.0f);
canvas.drawBitmap(bitmap, m, NULL);

【讨论】:

    【解决方案2】:

    好吧,我自己的解决方案是改用 TextureView 并通过 setTransform(matrix) 设置矩阵。

    如果有人有其他建议,欢迎发表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多