如何在 Android CameraX 中使用手动对焦?
How to use manual focus in Android CameraX?
我正在尝试像在 Camera2 中一样对 CameraX 进行手动对焦 API
在Camera2中API我使用下面的代码
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, mLensFocusDistance);
可以在 android 相机 X 中进行手动对焦吗?如果是如何
提前致谢
你应该设置 TouchListener
到 textureView 然后设置 focus(Kotlin
):
private fun setUpTapToFocus() {
textureView.setOnTouchListener { _, event ->
if (event.action != MotionEvent.ACTION_UP) {
return false
}
val cameraControl = CameraX.getCameraControl(CameraX.LensFacing.BACK) // you can set it to front
val factory = TextureViewMeteringPointFactory(textureView)
val point = factory.createPoint(event.x, event.y)
val action = FocusMeteringAction.Builder.from(point).build()
cameraControl.startFocusAndMetering(action)
return true
}
}
希望对您有所帮助
有一种方法可以通过使用 Camera2Interop.Extender
访问 low-level camera2 API 在 cameraX 中使用手动对焦。您应该像这样设置两个额外的选项来预览构建器:
void setFocusDistance(ExtendableBuilder<?> builder, float distance) {
Camera2Interop.Extender extender = new Camera2Interop.Extender(builder);
extender.setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
extender.setCaptureRequestOption(CaptureRequest.LENS_FOCUS_DISTANCE, distance);
}
并在构建您的 cameraX 预览请求时使用它:
float focusDistance = 0F; // example: infinite focus
Preview.Builder previewBuilder = new Preview.Builder();
setFocusDistance(previewBuilder, focusDistance);
preview = previewBuilder.build();
preview.setSurfaceProvider(viewFinder.getSurfaceProvider());
请注意,您也可以通过这种方式设置其他 camera2 CaptureRequest 选项。
以下是如何找到 LENS_INFO_MINIMUM_FOCUS_DISTANCE(通常是 10f 左右的值):
theCamera = cameraProvider.bindToLifecycle(...
CameraCharacteristics camChars = Camera2CameraInfo
.extractCameraCharacteristics(theCamera.getCameraInfo());
float discoveredMinFocusDistance = camChars
.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
Log.i("dev", "found it! " + discoveredMinFocusDistance);
我正在尝试像在 Camera2 中一样对 CameraX 进行手动对焦 API
在Camera2中API我使用下面的代码
final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, mLensFocusDistance);
可以在 android 相机 X 中进行手动对焦吗?如果是如何
提前致谢
你应该设置 TouchListener
到 textureView 然后设置 focus(Kotlin
):
private fun setUpTapToFocus() {
textureView.setOnTouchListener { _, event ->
if (event.action != MotionEvent.ACTION_UP) {
return false
}
val cameraControl = CameraX.getCameraControl(CameraX.LensFacing.BACK) // you can set it to front
val factory = TextureViewMeteringPointFactory(textureView)
val point = factory.createPoint(event.x, event.y)
val action = FocusMeteringAction.Builder.from(point).build()
cameraControl.startFocusAndMetering(action)
return true
}
}
希望对您有所帮助
有一种方法可以通过使用 Camera2Interop.Extender
访问 low-level camera2 API 在 cameraX 中使用手动对焦。您应该像这样设置两个额外的选项来预览构建器:
void setFocusDistance(ExtendableBuilder<?> builder, float distance) {
Camera2Interop.Extender extender = new Camera2Interop.Extender(builder);
extender.setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
extender.setCaptureRequestOption(CaptureRequest.LENS_FOCUS_DISTANCE, distance);
}
并在构建您的 cameraX 预览请求时使用它:
float focusDistance = 0F; // example: infinite focus
Preview.Builder previewBuilder = new Preview.Builder();
setFocusDistance(previewBuilder, focusDistance);
preview = previewBuilder.build();
preview.setSurfaceProvider(viewFinder.getSurfaceProvider());
请注意,您也可以通过这种方式设置其他 camera2 CaptureRequest 选项。
以下是如何找到 LENS_INFO_MINIMUM_FOCUS_DISTANCE(通常是 10f 左右的值):
theCamera = cameraProvider.bindToLifecycle(...
CameraCharacteristics camChars = Camera2CameraInfo
.extractCameraCharacteristics(theCamera.getCameraInfo());
float discoveredMinFocusDistance = camChars
.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
Log.i("dev", "found it! " + discoveredMinFocusDistance);