2012-03-28 4 views
6

Ich habe eine cameraPreview-Klasse (siehe unten), die Vollbild und Landschaft startet ... aber das Bild wird gestreckt/und verzerrt .. gibt es eine Möglichkeit, diese Vorschau im Vollbildmodus zu erhalten aber nicht verzerren?fullScreen Kamera Vorschau ohne Verzerrung/Streckung

camLayer:

public class CamLayer extends SurfaceView implements SurfaceHolder.Callback { 
     Camera camera; 
     SurfaceHolder previewHolder; 
     String camID; 
     private static final String TAG = "Cam Preview"; 


     public CamLayer(Context context, String facing) 
     { 
       super(context); 
       camID = facing; 
       previewHolder = this.getHolder(); 
       previewHolder.addCallback(this); 
       previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 


     } 
     public void surfaceCreated(SurfaceHolder holder) { 
      startCamera(); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
     { 
       Parameters params = camera.getParameters(); 
        //params.setPreviewSize(width, height); 
        //params.setPictureFormat(PixelFormat.JPEG); 
        camera.setParameters(params); 
        camera.startPreview(); 


     } 

     public void surfaceDestroyed(SurfaceHolder arg0) 
     { 

      stopCamera(); 
     } 



     public void onResume() { 

      startCamera(); 

     } 

     public void onPause() { 

      stopCamera(); 
     } 


     public void stopCamera(){ 
      System.out.println("stopCamera method"); 
      if (camera != null){ 
       camera.stopPreview(); 
       camera.setPreviewCallback(null); 
       camera.release(); 
       camera = null; 
       previewHolder.removeCallback(this); 
       previewHolder = null; 
      } 
     } 

     private void startCamera(){ 
      if(camID.equals("front")){ 
       camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 
      }else{ 
       camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); 
      } 
      try { 
        camera.setPreviewDisplay(previewHolder); 

       } 
        catch (Throwable e){ Log.w("TAG,", "failed create surface !?!?"); } 
     } 

     public void draw(Canvas canvas) { 
      super.draw(canvas); 
      Paint p = new Paint(Color.RED); 
      Log.d(TAG, "draw"); 
      canvas.drawText("PREVIEW", canvas.getWidth()/2, 
       canvas.getHeight()/2, p); 
     } 
} 
+0

ist das Problem gelöst? –

Antwort

1

Sie benötigen params.getSupportedPreviewSizes();

und von dem finden Sie die beste previewSize für Ihre Ansicht

Schauen Sie sich das Projekt auszuführen: https://github.com/commonsguy/cw-advandroid/blob/master/Camera/Picture/src/com/commonsware/android/picture/PictureDemo.java

private Camera.Size getBestPreviewSize(int width, int height, 
             Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width <= width && size.height <= height) { 
     if (result == null) { 
      result=size; 
     } 
     else { 
      int resultArea=result.width * result.height; 
      int newArea=size.width * size.height; 

      if (newArea > resultArea) { 
      result=size; 
      } 
     } 
     } 
    } 

    return(result); 
    } 
0

In Zusätzlich zu dem, was Lena Bru über das Finden eines Go sagt od Vorschau Größe, wenn es kein genaues Bildseitenverhältnis zwischen Ihren CamLayer Dimensionen und der Kamera Vorschau Größe gibt, die Sie auswählen, ist die einzige Möglichkeit, Verzerrungen zu vermeiden, das Layout Ihres CamLayers anzupassen.

Die Kameravorschau wird einfach gestreckt, um die gesamte Ansicht abzudecken, unabhängig vom Seitenverhältnis. Für eine unverzerrte Ansicht müssen Sie das Layout der Ansicht so konfigurieren, dass es dem ausgewählten Vorschaubildformat entspricht. Siehe Android-Entwickler-Website custom components documentation; besonders der Teil über onMeasure.

Sie möchten eine Breite und Höhe angeben, die auf dem Seitenverhältnis in der Vorschau basiert, und Sie müssen möglicherweise ein Relayout Ihrer Benutzeroberfläche auslösen, wenn Sie die Größe der Kameravorschau konfigurieren, um die Größe der Ansicht zu aktualisieren.