¿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).
- Cámara Android, onPictureTaken (byte imgData, Cámara fotográfica) método & PictureCallback nunca llamado
- Android setFocusArea y enfoque automático
- Nueva visión API - Tamaño de imagen
- ¿Cómo debo ajustar los valores de exposición y balance de blancos para la cámara personalizada
- Cámara Android setJpegQuality ignorado
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?
- Camera.open () devuelve null
- Problemas al capturar varias fotos: la aplicación deja de responder, la vista previa de la cámara se vuelve verde y no se guarda ninguna imagen
- Cómo configurar la previsualización de la cámara como fondo a la vista de superficie en rajawali y captura de pantalla con 3D Obj & Vista previa de la cámara
- Obtener la extensión de archivo de imágenes seleccionadas de galería o cámara, como cadena
- Creación de paquetes RTP desde la cámara Android para enviar
- Android Camera onPreviewFrame frame rate no es coherente
- Cámara personalizada Android congelar después del zoom
- Deje de guardar la imagen cuando abra la cámara usando Intentar desde mi aplicación
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.