Android Camera2 拍照(四)——对焦模式

本文介绍如何使用 Android Camera2 API 实现手动对焦功能,并提供了在手动与自动对焦模式间切换的方法。通过触摸预览区域来触发对焦,详细解释了对焦区域的设置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文: Android Camera2 拍照(四)——对焦模式

本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换。

一、手动对焦响应事件

首先我们要实现点击preview区域进行手动对焦,这通过对TextureView注册touch事件实现。

mTextureView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int actionMasked = MotionEventCompat.getActionMasked(event);
                int fingerX, fingerY;
                int length = (int) (getResources().getDisplayMetrics().density * 80);
                switch (actionMasked) {
                    case MotionEvent.ACTION_DOWN:
                        fingerX = (int) event.getX();
                        fingerY = (int) event.getY();
                        LogUtil.d("onTouch: x->" + fingerX + ",y->" + fingerY);

                        mIvFocus.setX(fingerX - length / 2);
                        mIvFocus.setY(fingerY - length / 2);

                        mIvFocus.setVisibility(View.VISIBLE);
                        triggerFocusArea(fingerX, fingerY);

                        break;
                }

                return false;
            }
        });

triggerFocusArea将实现手动对焦。

二、手动对焦实现

private void triggerFocusArea(float x, float y) {
        CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
        try {
            CameraCharacteristics characteristics
                    = manager.getCameraCharacteristics(mCameraId);
            Integer sensorOrientation = characteristics.get(
                    CameraCharacteristics.SENSOR_ORIENTATION);

            sensorOrientation = sensorOrientation == null ? 0 : sensorOrientation;

            Rect cropRegion = AutoFocusHelper.cropRegionForZoom(characteristics, 1f);
            mAERegions = AutoFocusHelper.aeRegionsForNormalizedCoord(x, y, cropRegion, sensorOrientation);
            mAFRegions = AutoFocusHelper.afRegionsForNormalizedCoord(x, y, cropRegion, sensorOrientation);

            // Step 1: Request single frame CONTROL_AF_TRIGGER_START.
            CaptureRequest.Builder builder;
            builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            builder.addTarget(mPreviewSurface);
            builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);

            mControlAFMode = AutoFocusMode.AUTO;

            builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode.switchToCamera2FocusMode());
            builder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
            mCaptureSession.capture(builder.build(), mPreCaptureCallback, mBackgroundHandler);

            // Step 2: Call repeatingPreview to update mControlAFMode.
            sendRepeatPreviewRequest();
            resumeContinuousAFAfterDelay(DELAY_TIME_RESUME_CONTINUOUS_AF);
        } catch (CameraAccessException ex) {
            Log.e(TAG, "Could not execute preview request.", ex);
        }
    }

首先将对焦模式设置为AutoFocusMode.AUTO。AutoFocusMode是定义枚举类型,其定义如下:

enum AutoFocusMode {
        /**
         * System is continuously focusing.
         */
        CONTINUOUS_PICTURE,
        /**
         * System is running a triggered scan.
         */
        AUTO;

        int switchToCamera2FocusMode() {
            switch (this) {
                case CONTINUOUS_PICTURE:
                    return CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
                case AUTO:
                    return CameraMetadata.CONTROL_AF_MODE_AUTO;
                default:
                    return CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
            }
        }
    }

用来实现自定义对焦模式和CameraMetadata中对焦模式的对应。其中AUTO即对应手动对焦

然后通过builder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode.switchToCamera2FocusMode());将对焦模式切换为手动对焦。在确定定位区域之后,通过函sendRepeatPreviewRequest恢复到

CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE;

源码参考:https://github.com/gengqifu/361Camera,欢迎fork/star。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值