¿Cuál es la forma correcta de implementar Toque para enfocar para la cámara?

Estoy trabajando en una aplicación que tiene una pantalla de cámara personalizada, por lo que se supone que implementar toque para enfocar, como en la aplicación de la cámara Android (más específicamente, la Galaxy S4).

He intentado usar los pasos descritos aquí , pero no parece causar ningún foco notable. El modo de enfoque está configurado en imagen continua (sólo estamos admitiendo un dispositivo específico).

Cuando el usuario hace tapping en la vista previa de la cámara, necesito concentrarme en la mitad superior de la imagen. Para ello, utilizo el fragmento de código

Parameters parameters = mCamera.getParameters(); if (parameters.getMaxNumFocusAreas() > 0) { ArrayList<Area> focusAreas = new ArrayList<Camera.Area>(1); focusAreas.add(new Area(new Rect(-1000, -1000, 1000, 0), 750)); parameters.setFocusAreas(focusAreas); mCamera.setParameters(parameters); } 

No quiero AutoFocus ya que tarda demasiado tiempo en enfocar la imagen. Estoy interesado sólo en la mitad superior de la imagen. ¿Alguien ha implementado correctamente el botón para enfocar junto con el modo de imagen continua?

Chocó en este tema recientemente. Como dijo MatheusJardimB, esta pregunta ayuda mucho.

Sin embargo, en mi caso, quería iniciar en el modo de ContinuousPicture entonces ser capaz de tocar para enfocar y luego continuar con el modo de ContinuousPicture .

Me las arreglé para conseguir que funcione mediante el método onAutoFocus de la Camera.AutoFocusCallback() . No estoy seguro si es la mejor o la manera más bonita de hacerlo, pero parece que funciona.

Aquí está el código:

 setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mCamera != null) { Camera camera = mCamera.getCamera(); camera.cancelAutoFocus(); Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f); Parameters parameters = camera.getParameters(); parameters.setFocusMode(Parameters.FOCUS_MODE_MACRO); if (parameters.getMaxNumFocusAreas() > 0) { List<Area> mylist = new ArrayList<Area>(); mylist.add(new Camera.Area(focusRect, 1000)); parameters.setFocusAreas(mylist); } camera.setParameters(parameters); camera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { camera.cancelAutoFocus(); Parameters params = camera.getParameters(); if (params.getFocusMode().equals(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); camera.setParameters(params); } } }); } return true; } return false; }); 

Podría cambiar el área de enfoque a

 ArrayList<Area> focusAreas = new ArrayList<Camera.Area>(1); focusAreas.add(new Area(new Rect(-1000, -1000, 1000, 0), 750)); 

Y debería funcionar.

ACTUALIZAR

Recientemente adquirí un Samsung S5 y probé esto en él. No funcionó tan bien, así que añadí algunas modificaciones y está funcionando ahora. Esto también fue probado con éxito en el Galaxy S6 y Galaxy Note4.

Aquí está el código modificado:

 setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mCamera != null) { Camera camera = mCamera.getCamera(); camera.cancelAutoFocus(); Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f); Parameters parameters = camera.getParameters(); if (parameters.getFocusMode().equals( Camera.Parameters.FOCUS_MODE_AUTO) { parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO); } if (parameters.getMaxNumFocusAreas() > 0) { List<Area> mylist = new ArrayList<Area>(); mylist.add(new Camera.Area(focusRect, 1000)); parameters.setFocusAreas(mylist); } try { camera.cancelAutoFocus(); camera.setParameters(parameters); camera.startPreview(); camera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (camera.getParameters().getFocusMode().equals(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { Parameters parameters = camera.getParameters(); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); if (parameters.getMaxNumFocusAreas() > 0) { parameters.setFocusAreas(null); } camera.setParameters(parameters); camera.startPreview(); } } }); } catch (Exception e) { e.printStackTrace(); } } return true; } }); 

Esto tiene la solución. Acabo de añadir la implementación de algunos métodos que faltan en su código.

 private static final int FOCUS_AREA_SIZE= 300; 

//

 mCameraPreview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { focusOnTouch(event); } return true; } }); 

//

  private void focusOnTouch(MotionEvent event) { if (mCamera != null ) { Camera.Parameters parameters = mCamera.getParameters(); if (parameters.getMaxNumMeteringAreas() > 0){ Log.i(TAG,"fancy !"); Rect rect = calculateFocusArea(event.getX(), event.getY()); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>(); meteringAreas.add(new Camera.Area(rect, 800)); parameters.setFocusAreas(meteringAreas); mCamera.setParameters(parameters); mCamera.autoFocus(mAutoFocusTakePictureCallback); }else { mCamera.autoFocus(mAutoFocusTakePictureCallback); } } } private Rect calculateFocusArea(float x, float y) { int left = clamp(Float.valueOf((x / mCameraPreview.getWidth()) * 2000 - 1000).intValue(), FOCUS_AREA_SIZE); int top = clamp(Float.valueOf((y / mCameraPreview.getHeight()) * 2000 - 1000).intValue(), FOCUS_AREA_SIZE); return new Rect(left, top, left + FOCUS_AREA_SIZE, top + FOCUS_AREA_SIZE); } private int clamp(int touchCoordinateInCameraReper, int focusAreaSize) { int result; if (Math.abs(touchCoordinateInCameraReper)+focusAreaSize/2>1000){ if (touchCoordinateInCameraReper>0){ result = 1000 - focusAreaSize/2; } else { result = -1000 + focusAreaSize/2; } } else{ result = touchCoordinateInCameraReper - focusAreaSize/2; } return result; } 

// implementar esta devolución de llamada para activar el enfoque.

 private Camera.AutoFocusCallback mAutoFocusTakePictureCallback = new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { // do something... Log.i("tap_to_focus","success!"); } else { // do something... Log.i("tap_to_focus","fail!"); } } }; 

Una de las otras respuestas hace que tu cámara descarte los puntos de enfoque previamente dados y vuelve al enfoque continuo que no creo que tenga sentido.

También si echas un vistazo al enlace en el post la respuesta original usa parameters.setFocusMode (Parameters.FOCUS_MODE_AUTO);

He implementado lo anterior con esta línea de código en lugar de enfoque continuo y parece que funciona mucho mejor.

Tengo el mismo problema. He comprobado esto en muchos dispositivos, y muchas versiones de Android.

Parece que la zona de enfoque no funciona en el modo de enfoque CONTINUO .

Mi solución es configurar el modo de enfoque en AUTO o MACRO junto con la configuración del área de enfoque:

 params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO); params.setFocusAreas(focusAreas); mCamera.setParameters(params); 

Tenga en cuenta que la aplicación de cámara de fotos en Galaxy S3 y S4 funciona de la misma manera: está permanentemente en modo continuo. Cuando toca la pantalla cambia a auto y ajusta el área de enfoque. Pero después de un tiempo vuelve al modo continuo, y la zona de enfoque vuelve al centro de la pantalla.

Espero que esto te ayude de alguna manera.

  • Cómo omitir o evitar la opción de "volver a tomar y revisar" después de capturar la foto de la cámara mediante ACTION_IMAGE_CAPTURE
  • Tamaños de imagen compatibles con la cámara Android
  • La previsualización personalizada de la cámara se alarga cuando MediaRecorder.start () se llama
  • La foto gira 90 grados mientras captura en algunos teléfonos
  • ¿Cuál es la diferencia entre `opencv.android.JavaCameraView` y` opencv.android.NativeCameraView`
  • ¿Qué formato es para la cámara de Android con raw pictureCallback?
  • Cómo encender la linterna y la cámara frontal al mismo tiempo en android
  • Servidor de la cámara Android muerto y error de la cámara - 100
  • ¿Cómo selecciono la cámara correcta para encender la linterna, en Android 2.2?
  • Dónde colocar el autofoco en la cámara de la clase android
  • ¿Es posible medir la distancia al objeto con la cámara?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.