android 慢动作触发区域对焦

一、普通模式区域对焦

Android Camera2 实现触摸对焦功能(Touch to Focus) - 简书

关键代码

public void startControlAFRequest(MeteringRectangle rect,
                                        CameraCaptureSession.CaptureCallback captureCallback) {

    MeteringRectangle[] rectangle = new MeteringRectangle[]{rect};
    // 对焦模式必须设置为AUTO
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_AUTO);
    //AE
    mPreviewBuilder.set(CaptureRequest.CONTROL_AE_REGIONS,rectangle);
    //AF 此处AF和AE用的同一个rect, 实际AE矩形面积比AF稍大, 这样测光效果更好
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_REGIONS,rectangle);
    try {
        // AE/AF区域设置通过setRepeatingRequest不断发请求
        mSession.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    //触发对焦
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_START);
    try {
        //触发对焦通过capture发送请求, 因为用户点击屏幕后只需触发一次对焦
        mSession.capture(mPreviewBuilder.build(), captureCallback, mHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

//触发对焦通过capture发送请求, 因为用户点击屏幕后只需触发一次对焦
mSession.capture(mPreviewBuilder.build(), captureCallback, mHandler);

二、慢动作模式区域对焦

慢动作模式使用上述mSession.capture是无法完成对焦的,需要使用mSession.captureBurst来完成。

2.1 创建List<CaptureRequest>

    public List<CaptureRequest> createHighSpeedRequestList(
        CameraDevice cameraDevice, CameraConstrainedHighSpeedCaptureSession session,
        int templateType, Surface... surfaces) {

        CaptureRequest.Builder reqBuilder;
        List<CaptureRequest> list;
        try {
            reqBuilder = cameraDevice.createCaptureRequest(templateType);
            for (CaptureRequest.Key<?> key : mCaptureRequests.keySet()) {
                setRequest(reqBuilder, key);
            }
            addRequestParameter(reqBuilder);

            for (Surface surface : surfaces) {
                reqBuilder.addTarget(surface);
            }
            list = session.createHighSpeedRequestList(reqBuilder.build());
        } catch (CameraAccessException err) {
            err.printStackTrace();
            return null;
        }

        return list;
    }

2.2 进行一次对焦动作

List<CaptureRequest> requestList = createHighSpeedRequestList(...);
mSession.captureBurst(requestList, captureCallback, mHandler);

项目经验,仅供参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值