2012-06-22 22 views

Respuesta

-3

Si está hablando de vista previa, intente configurar el tamaño de SurfaceView igual que el tamaño de vista previa de la cámara. De esa manera, la vista previa no debe ser escalada.

8

Debe elegir un tamaño de vista previa que coincida con el tamaño de su pantalla. Sugeriría cambiar la configuración de tamaño de vista previa para que coincida con su SurfaceView en lugar de al revés. Si bien los datos de la vista previa están bien, no están distorsionados, se verán distorsionados cuando se los arroje a una superficie con una relación de aspecto diferente.

Si tiene una vista de pantalla completa, entonces debe encontrar que la cámara tiene un tamaño de vista previa que coincida con ese tamaño, al menos habrá uno con la misma relación de aspecto. Por ejemplo, si su pantalla es de 640x480, entonces un tamaño de vista previa de 320x240 no aparecerá estirado en una pantalla completa SurfaceView.

+0

Para establecer el tamaño de vista previa que estoy usando siguiente código pero todavía superficie se ve estirada: privada Camera.Size getBestPreviewSize (int ancho, int altura, \t \t \t parámetros Camera.Parameters) { \t \t Camera.Size result = null; \t \t para (tamaño Camera.Size: parameters.getSupportedPreviewSizes()) { \t \t \t si (Tamano.Width <= ancho && size.height <= altura) { \t \t \t \t si (resultado == null) { \t \t \t \t \t resultado = tamaño; \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.altura; \t \t \t \t \t si (newArea> resultArea) { \t \t \t \t \t \t resultado = tamaño; \t \t \t \t \t} \t \t \t \t} \t \t \t} \t \t} \t \t retorno (resultado); \t} – Manjeet

+0

¿Por qué lo haces de esta manera? solo busca una coincidencia exacta simple primero. Parece que estás copiando código muy antiguo de Barcode Scanner. –

3

i fijo esto añadiendo esto antes de llamar camera.startPreview():

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

Podría ayudar a alguien.

+11

En muchos casos esto arroja una excepción de Runtime (setParameters failed) porque el tamaño de SurfaceView no coincide con ningún tamaño de vista previa compatible. – marino

+0

Debe establecer el tamaño de vista previa proporcionado por getSupportedPreviewSize() de acuerdo con los documentos. Dice que no debe establecer ningún valor arbitrario en setPreviewSize(). –

4

Tienes que restringir el tamaño de vista previa basado en (1) los tamaños de vista previa disponibles (2) tu vista. Aquí está mi solución si aún la necesita:

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

¡La solución es simple! Si usas SurfaceView en la barra de acción, este puede ser el problema. Uso esta línea y puedo arreglarla, pero no pruebo usando la barra de acciones.

uso esto:

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