2017-05-12 34 views
1

當我顯示相機預覽它伸展所以,我搜索並找到了一些東西。但它運作不好。我正在使用surfaceView進行顯示預覽。 這是我使用的代碼。獲取最佳的預覽大小的相機在Android

getOptimalPreviewSize

private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 
    final double ASPECT_TOLERANCE = 0.1; 
    double targetRatio=(double)h/w; 

    if (sizes == null) return null; 

    Camera.Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 

    int targetHeight = h; 

    for (Camera.Size size : sizes) { 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 

    if (optimalSize == null) { 
     minDiff = Double.MAX_VALUE; 
     for (Camera.Size size : sizes) { 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 
    Log.i(TAG, "width = "+ optimalSize.width +" height = "+ optimalSize.height); 
    return optimalSize; 
} 

surfaceChanged

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Log.i(TAG, "surfaceChanged : width = "+width +" height = "+height); 
    if (mSupportedPreviewSizes != null) { 
     Log.i(TAG, "mSupportedPreviewSizes"); 

     // Get Optimal Preview Size 
     mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); 

     // Setting the optimal preview for best result 
     if(mPreviewSize != null) { 
      Log.i(TAG, "Activate Optimal Preview"); 
      Camera.Parameters parameters = mCamera.getParameters(); 
      parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 
     } 

    }h 
} 

登錄

surfaceChanged : width = 720 height = 1134 

    optimalPreviewSize width = 800 height = 480 

正如你看到這兩個widthheight是不一樣我認爲這就是爲什麼這不顯示預覽不錯。我可以爲此做些什麼。我是Android新手。

+0

我更喜歡這個庫。它是定製相機的最佳庫。我在各種設備測試和相機預覽不拉伸。 https://github.com/google/cameraview –

回答

1

我發現了一個錯誤:

if (Math.abs(size.height - targetHeight) < minDiff) { 

相機預覽大小爲景觀佈局大小。所以size.height實際上是設備寬度。但是targetHeight是視圖高度(通常視圖是設備大小)。 修復

targetHeight = Math.min(w, h) 

你可以找到自定義相機谷歌的演示代碼GoogleDemoCode