一、普通模式区域对焦
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
- public List
createHighSpeedRequestList( - CameraDevice cameraDevice, CameraConstrainedHighSpeedCaptureSession session,
- int templateType, Surface... surfaces) {
-
- CaptureRequest.Builder reqBuilder;
- List
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
requestList = createHighSpeedRequestList(...); - mSession.captureBurst(requestList, captureCallback, mHandler);
项目经验,仅供参考