web-dev-qa-db-ja.com

Android CameraXでオートフォーカスする方法

Androidはこの数か月で新しいAPI cameraxをリリースしました。カメラが機能するようにオートフォーカスを取得する方法を理解しようとしています。

https://groups.google.com/a/Android.com/forum/#!searchin/camerax-developers/auto $ 20focus | sort:date/camerax-developers/IQ3KZd8iOIY/LIbrRIqEBgAJ

これはトピックに関する議論ですが、特定のドキュメントはほとんどありません。

https://github.com/Android/camera-samples/tree/master/CameraXBasic/app/src/main/Java/com/Android/example/cameraxbasic

こちらも基本的なcameraxアプリですが、オートフォーカスに関連するファイルが見つかりませんでした。

ドキュメントへのヒントまたはポイントは役に立ちます。また、私はAndroidにかなり慣れているので、上記のリンクをより便利にする何かが欠けている可能性が非常に高いです。

4
Blue

「1.0.0-alpha05」で追加されたFocusに関するドキュメントはここにあります https://developer.Android.com/jetpack/androidx/releases/camera#camera2-core-1.0.0- alpha05

基本的には、ビューにタッチリスナーを設定し、クリックした位置をつかむ必要があります

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

この位置をポイントに変換します

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;
    }
0
JonathanG