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

简介: 原文:Android Camera2 拍照(四)——对焦模式 本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换。
原文: 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。

目录
相关文章
|
6月前
|
Android开发
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
62 0
|
6月前
|
XML 前端开发 测试技术
Android基础知识:解释Android的MVC和MVP模式。
Android基础知识:解释Android的MVC和MVP模式。
66 0
|
数据采集 编解码 API
如何实现Android平台GB28181设备对接Camera2数据
在写如何实现Android平台GB28181设备对接Camera2数据说明之前,我在前两年的blog就有针对camera2的RTMP直播推送模块做过技术分享:
如何实现Android平台GB28181设备对接Camera2数据
|
API Android开发 计算机视觉
视觉智能平台有android人脸识别拍照demo?
视觉智能平台有android人脸识别拍照demo么?
104 0
|
测试技术 Android开发 虚拟化
踩坑记录 | Android 逆向之如何处理 Kali Nat 模式无法上网?
踩坑记录 | Android 逆向之如何处理 Kali Nat 模式无法上网?
308 0
|
3月前
|
设计模式 Android开发 Kotlin
Android经典实战之Kotlin委托模式和by关键字
本文介绍了Kotlin中`by`关键字在类及属性委托中的运用,通过实例展示了如何利用类委托简化接口实现,以及如何借助标准与自定义属性委托管理属性的读写操作。通过`by`关键字的支持,Kotlin使得委托模式的实现更为直观且高效。
86 4
|
4月前
|
存储 前端开发 测试技术
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
使用Kotlin实现MVVM模式是Android开发的现代实践。该模式分离UI和业务逻辑,借助LiveData、ViewModel和DataBinding增强代码可维护性。步骤包括创建Model层处理数据,ViewModel层作为数据桥梁,以及View层展示UI。添加相关依赖后,Model类存储数据,ViewModel类通过LiveData管理变化,而View层使用DataBinding实时更新UI。这种架构提升代码可测试性和模块化。
186 2
|
6月前
|
传感器 小程序 Java
Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码
Java+saas模式 智慧校园系统源码Java Android +MySQL+ IDEA 多校运营数字化校园云平台源码 智慧校园即智慧化的校园,也指按智慧化标准进行的校园建设,按标准《智慧校园总体框架》中对智慧校园的标准定义是:物理空间和信息空间的有机衔接,使任何人、任何时间、任何地点都能便捷的获取资源和服务。
69 1
|
6月前
|
设计模式 前端开发 数据库
构建高效Android应用:使用Jetpack架构组件实现MVVM模式
【4月更文挑战第21天】 在移动开发领域,构建一个既健壮又易于维护的Android应用是每个开发者的目标。随着项目复杂度的增加,传统的MVP或MVC架构往往难以应对快速变化的市场需求和复杂的业务逻辑。本文将探讨如何利用Android Jetpack中的架构组件来实施MVVM(Model-View-ViewModel)设计模式,旨在提供一个更加模块化、可测试且易于管理的代码结构。通过具体案例分析,我们将展示如何使用LiveData, ViewModel, 和Repository来实现界面与业务逻辑的分离,以及如何利用Room数据库进行持久化存储。最终,你将获得一个响应迅速、可扩展且符合现代软件工
94 0
|
6月前
|
XML 数据库 数据安全/隐私保护
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
77 0