You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:27:15