web-dev-qa-db-fra.com

Comment se concentrer automatiquement avec Android Camerax

Android a publié une nouvelle caméraille d'API ces derniers mois. J'essaie de comprendre comment se concentrer automatiquement pour que la caméra fonctionne.

https://groups.google.com/a/androïde.com/forum/#!SearchIn/camerax-developers/auto $ 20Focus | Trier: Date/Camerax-Developers/IQ3KZD8IOIY/LIBRERIQEBGAJ

Voici une discussion sur le sujet, mais il n'y a presque pas de documentation spécifique à ce sujet.

https://github.com/andrroid/camera-samples/tree/appr/cameraxbasic/app/src/main/java/com/andrroid/example/cameraxbasic

Voici également l'application de base Camerax, mais je n'ai pas pu trouver de fichier traitant de la mise au point automatique.

Tous les conseils ou points à la documentation sont utiles. Aussi je suis assez nouveau à Android Donc, il est donc très possible, je manque quelque chose qui rend les liens ci-dessus plus utiles.

6
Blue

Vous pouvez trouver le Doc ici à propos de la mise au point tel qu'il a été ajouté dans "1.0.0-Alpha05" https://developer.android.com/jetpack/androidx/relases/camera#camera2-core-1.0.0- alpha05

Fondamentalement, vous devez définir un auditeur tactile à votre vue et saisir la position cliquée.

private boolean onTouchToFocus(View viewA, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_UP:
                    return focus(event);
                break;
            default:
                // Unhandled event.
                return false;
        }
        return true;
    }

Et traduisez cette position en point

private boolean focus(MotionEvent event) {
        final float x = (event != null) ? event.getX() : getView().getX() + getView().getWidth() / 2f;
        final float y = (event != null) ? event.getY() : getView().getY() + getView().getHeight() / 2f;

        TextureViewMeteringPointFactory pointFactory = new TextureViewMeteringPointFactory(textureView);
        float afPointWidth = 1.0f / 6.0f;  // 1/6 total area
        float aePointWidth = afPointWidth * 1.5f;
        MeteringPoint afPoint = pointFactory.createPoint(x, y, afPointWidth, 1.0f);
        MeteringPoint aePoint = pointFactory.createPoint(x, y, aePointWidth, 1.0f);

           try {
            CameraX.getCameraControl(lensFacing).startFocusAndMetering(
                FocusMeteringAction.Builder.from(afPoint, FocusMeteringAction.MeteringMode.AF_ONLY)
                                           .addPoint(aePoint, FocusMeteringAction.MeteringMode.AE_ONLY)
                                           .build());
        } catch (CameraInfoUnavailableException e) {
            Log.d(TAG, "cannot access camera", e);
        }

        return true;
    }
1
JonathanG

Il suffit de signaler, pour obtenir le "Tape pour se concentrer" Utilisation d'AperviewView, vous devez utiliser displayorienteDeteringPointFactory. Sinon, vous vous ferez foiré des coordonnées.

val factory = DisplayOrientedMeteringPointFactory(activity.display, camera.cameraInfo, previewView.width.toFloat(), previewView.height.toFloat())

Pour le reste, utilisez la réponse de la matpag.

0
Bonco