无法缩放或翻转surfaceview矩阵

时间:2014-03-05 10:42:53

标签: android matrix android-camera surfaceview

我正在制作相机应用程序。我使用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(),我尝试将最后两行添加到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);
                  }

但我到处都遇到同样的错误(以及app崩溃):

java.lang.IllegalStateException: Matrix can not be modified

我做错了什么?是否有可能改变SurfaceView的尺寸?如果没有,是否有其他方式来翻转相机预览?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

嗯,我自己的解决方案是使用TextureView代替并通过setTransform(矩阵)设置矩阵。

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