2014-03-05 19 views
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矩陣。我試圖用預分頻()和後分頻器(),我嘗試添加的最後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 

我在做什麼錯?是否有可能更改ScaleView SurfaceView?如果沒有,是否有其他方式來翻轉相機預覽?

+0

如果你想進入的OpenGL ES,你可以做各種事情(例如參見「顯示+捕捉相機「在https://github.com/google/grafika)。但這確實增加了很多複雜性。 – fadden

回答

0

那麼,我自己的解決方案是使用TextureView來代替並通過setTransform(矩陣)設置矩陣。

如果有人有其他建議,歡迎您發表。

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