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.
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.
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;
}
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.