Jetpack Compose中CameraX触摸对焦实现报错求助
解决Jetpack Compose中CameraX触摸对焦的实现问题
错误原因分析
你调用的isTapToFocusEnabled()是无参方法,仅用于判断当前设备是否支持触摸对焦能力,并非触发对焦的操作API,所以传入focusX、focusY参数会直接报错。要实现触摸对焦,需要使用CameraX专门的触发对焦接口。
正确实现步骤
1. 确认CameraX依赖版本
确保使用camera-view:1.2.0及以上版本的依赖,保证触摸对焦API可用:
dependencies { def camerax_version = "1.2.3" implementation "androidx.camera:camera-core:$camerax_version" implementation "androidx.camera:camera-camera2:$camerax_version" implementation "androidx.camera:camera-view:$camerax_version" implementation "androidx.camera:camera-lifecycle:$camerax_version" }
2. 修正触摸对焦逻辑
核心是把PreviewView的触摸坐标转换为相机传感器的归一化坐标(范围0-1),再调用setTapToFocus()触发对焦:
AndroidView(modifier = Modifier.fillMaxSize(), factory = { context -> PreviewView(context).apply { controller = controller controller.bindToLifecycle(lifecycleOwner) implementationMode = PreviewView.ImplementationMode.COMPATIBLE setOnTouchListener { _, event -> // 仅在手指按下时触发对焦,避免重复操作 if (event.action == MotionEvent.ACTION_DOWN) { // 将View触摸坐标转为相机识别的归一化坐标 val focusPoint = MeteringPointFactory.create(this) .createPoint(event.x, event.y) // 触发触摸对焦 controller.setTapToFocus(focusPoint, lifecycleOwner) } true // 消费触摸事件,避免事件透传 } } })
3. 可选优化
可以先判断设备是否支持触摸对焦,避免无效操作:
if (controller.isTapToFocusEnabled()) { // 执行上述对焦逻辑 }
内容的提问来源于stack exchange,提问作者mkysln
相关产品推荐
相关产品推荐

