2012-03-28 16 views
6

Tengo una clase de vista previa de la cámara (ver más abajo) que está ejecutando pantalla completa y paisaje ... pero la imagen se estira/distorsiona ... ¿Hay alguna manera de conseguir que esta vista previa permanezca en pantalla completa? pero no distorsionar?fullScreen Previsualización de la cámara sin distorsión/estiramiento

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

es el problema resuelto? –

Respuesta

1

Tiene que ejecutar params.getSupportedPreviewSizes();

y desde que encontramos el mejor previewSize para la vista

mirada a este proyecto: 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

En Además de lo que dice Lena Bru sobre encontrar un ir od tamaño de previsualización, si no existe una relación de aspecto exacta entre las dimensiones de CamLayer y el tamaño de vista previa de la cámara que seleccione, la única opción para evitar la distorsión es ajustar el diseño de su CamLayer.

La vista previa de la cámara simplemente se estira para cubrir toda la vista, independientemente de las relaciones de aspecto, por lo que para una vista sin distorsión, debe configurar el diseño de la vista para que coincida con la relación de aspecto de vista previa seleccionada. Consulte el sitio para desarrolladores de Android custom components documentation; especialmente la parte sobre onMeasure.

Deseará informar un ancho y una altura basados ​​en la proporción de aspecto de la vista previa, y es posible que deba desencadenar una retransmisión de su UI cuando configure el tamaño de vista previa de la cámara para actualizar el tamaño de la Vista.

Cuestiones relacionadas