2012-06-22 2 views

Antwort

-3

Wenn Sie Vorschau sprechen, versuchen Sie die Größe der Surface Einstellung Vorschaugröße der gleiche wie die Kamera. Auf diese Weise sollte die Vorschau nicht skaliert werden.

8

Sie brauchen eine Vorschaugröße zu wählen, die Ihre Anzeigegröße entspricht. Ich würde vorschlagen, die Einstellung der Vorschaugröße so zu ändern, dass sie zu Ihrer SurfaceView passt und nicht umgekehrt. Während die Vorschaudaten in Ordnung sind, ist es nicht verzerrt, es sieht verzerrt aus, wenn es auf eine Oberfläche mit unterschiedlichem Seitenverhältnis geworfen wird.

Wenn Sie eine Vollbildansicht haben, sollten Sie feststellen, dass die Kamera eine Vorschaugröße hat, die dieser Größe entspricht - mindestens wird eine mit demselben Seitenverhältnis angezeigt. Wenn der Bildschirm beispielsweise 640 x 480 Pixel groß ist, wird eine Vorschaugröße von 320 x 240 nicht auf einem Vollbildmodus SurfaceView angezeigt.

+0

Um die Vorschaugröße eingestellt Ich verwende folgenden Code aber noch sieht Oberfläche gestreckt: privat Camera.Size getBestPreviewSize (int width, int height, \t \t \t Camera.Parameters Parameter) { \t \t Camera.Size Ergebnis = null; \t \t für (Camera.Size Größe: parameters.getSupportedPreviewSizes()) { \t \t \t if (Size.width <= Breite && Size.height <= Höhe) { \t \t \t \t if (result == null) { \t \t \t \t \t Ergebnis = Größe; \t \t \t \t} else { \t \t \t \t \t int resultArea = result.width * result.height; \t \t \t \t \t int newArea = size.width * size.Höhe; \t \t \t \t \t if (newArea> resultArea) { \t \t \t \t \t \t result = Größe; \t \t \t \t \t} \t \t \t \t} \t \t \t } \t \t} \t \t return (result); \t} – Manjeet

+0

Warum machst du es so? Suchen Sie zuerst nach einer einfachen genauen Übereinstimmung. Sieht so aus, als ob Sie sehr alten Code aus dem Barcode Scanner kopieren. –

3

Ich reparierte diese durch das Hinzufügen vor camera.startPreview() aufrufen:

Camera.Parameters parameters = camera.getParameters(); 
parameters.setPreviewSize(yourSurfaceView.getWidth(), yourSurfaceView.getHeight()); 
camera.setParameters(parameters); 

Es jemand helfen könnte.

+11

In vielen Fällen wird dadurch eine Runtime-Ausnahme ausgelöst (setParameters failed), da die Größe von surfaceView keiner unterstützten Vorschaugröße entspricht. – marino

+0

Sie müssen die Vorschaugröße so einstellen, wie sie von getSupportedPreviewSize() bereitgestellt wird. Dies entspricht den Dokumentationen. Es besagt, dass Sie keine beliebigen Werte auf setPreviewSize() setzen dürfen. –

4

Sie haben Ihre Vorschau Größe zu beschränken, basierend auf (1) Vorschau verfügbar Größen (2) Ihre Ansicht. Hier ist meine Lösung, wenn Sie noch brauchen es:

private class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    private void startPreview() { 
     try { 
     /** 
     * Orientation should be adjusted, see http://stackoverflow.com/questions/20064793/how-to-fix-camera-orientation/26979987#26979987 
     */ 

      Camera.Parameters parameters = mCamera.getParameters(); 
      List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 
      Camera.Size previewSize = null; 
      float closestRatio = Float.MAX_VALUE; 

      int targetPreviewWidth = isLandscape() ? getWidth() : getHeight(); 
      int targetPreviewHeight = isLandscape() ? getHeight() : getWidth(); 
      float targetRatio = targetPreviewWidth/(float) targetPreviewHeight; 

      Log.v(TAG, "target size: " + targetPreviewWidth + "/" + targetPreviewHeight + " ratio:" + targetRatio); 
      for (Camera.Size candidateSize : previewSizes) { 
       float whRatio = candidateSize.width/(float) candidateSize.height; 
       if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) { 
        closestRatio = whRatio; 
        previewSize = candidateSize; 
       } 
      } 

      Log.v(TAG, "preview size: " + previewSize.width + "/" + previewSize.height); 
      parameters.setPreviewSize(previewSize.width, previewSize.height); 
      mCamera.setParameters(parameters); 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
     } 
    } 
} 
-1

Die Lösung ist einfach! Wenn Sie Surfaceview unter Actionbar verwenden, ist dies möglicherweise das Problem. Ich benutze diese Zeile und kann das beheben, aber ich teste nicht mit der Aktionsleiste.

Verwendung dieses:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);