无法缩放或翻转SurfaceView矩阵。

3

我正在开发一款相机应用。我使用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);
                  }

但我在任何地方都遇到了同样的错误(连同应用程序崩溃):
java.lang.IllegalStateException: Matrix can not be modified

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


如果你想进入OpenGL ES,你可以做各种各样的事情(例如在https://github.com/google/grafika中查看“显示+捕获相机”)。但这确实增加了很多复杂性。 - fadden
2个回答

1
为了澄清Madhusudan几个月前发布的答案,你需要使用set()进行矩阵的深拷贝,而不是创建一个空矩阵然后将其设置为你的预览矩阵。

代码应该类似于这样:

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);

0

嗯,我的解决方案是使用TextureView,并通过setTransform(matrix)方法设置矩阵。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接