Saltar al contenido

Android setFocusArea y Auto Focus

Luego de tanto luchar hemos hallado la contestación de esta contratiempo que ciertos los lectores de este sitio tienen. Si tienes algún detalle que compartir no dejes de compartir tu conocimiento.

Solución:

Mi problema era mucho más simple 🙂

Todo lo que tenía que hacer era cancelar previamente llamado autofocus. Básicamente, el orden correcto de acciones es este:

protected void focusOnTouch(MotionEvent event) 
    if (camera != null) 

        camera.cancelAutoFocus();
        Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f);
        Rect meteringRect = calculateTapArea(event.getX(), event.getY(), 1.5f);

        Parameters parameters = camera.getParameters();
        parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
        parameters.setFocusAreas(Lists.newArrayList(new Camera.Area(focusRect, 1000)));

        if (meteringAreaSupported) 
            parameters.setMeteringAreas(Lists.newArrayList(new Camera.Area(meteringRect, 1000)));
        

        camera.setParameters(parameters);
        camera.autoFocus(this);
    

Actualizar

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    ...
    Parameters p = camera.getParameters();
    if (p.getMaxNumMeteringAreas() > 0) 
       this.meteringAreaSupported = true;
    
    ...


/**
 * Convert touch position x:y to @link Camera.Area position -1000:-1000 to 1000:1000.
 */
private Rect calculateTapArea(float x, float y, float coefficient) 
    int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();

    int left = clamp((int) x - areaSize / 2, 0, getSurfaceView().getWidth() - areaSize);
    int top = clamp((int) y - areaSize / 2, 0, getSurfaceView().getHeight() - areaSize);

    RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);
    matrix.mapRect(rectF);

    return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));


private int clamp(int x, int min, int max) 
    if (x > max) 
        return max;
    
    if (x < min) 
        return min;
    
    return x;

Al lado de la configuración:

parameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);

necesitas configurar:

parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);

si desea un enfoque automático "en vivo" real. Además, será bueno verificar los enfoques disponibles:

List focusModes = parameters.getSupportedFocusModes();
LLog.d("focusModes=" + focusModes);
if (focusModes.contains(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE))
    parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);

En Samsung S6, debe configurar esto con un pequeño retraso (~ 500 ms) después de obtener la vista previa de la cámara.

Tuve este problema hoy: /

¡Y después de horas de lucha, encontré la solución!

Es extraño, pero parece que configurar el modo de enfoque en "macro"Justo antes de establecer áreas de enfoque resolvió el problema;)

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

Tengo Galaxy S3 con Android 4.1.2

Espero que esto funcione para ti también 🙂

Si conservas algún titubeo o disposición de aclarar nuestro escrito eres capaz de ejecutar una acotación y con gusto lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *