欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Android >内容正文

Android

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

发布时间:2024/4/17 Android 59 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Android Camera2 拍照(四)——对焦模式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
原文:Android Camera2 拍照(四)——对焦模式

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

一、手动对焦响应事件

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

mTextureView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic 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。

总结

以上是生活随笔为你收集整理的Android Camera2 拍照(四)——对焦模式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。