Mapbox v10触摸地图时相机动画不触发问题如何解决
问题根因
主流地图SDK默认的长按回调仅在手指抬起(手势结束)时触发,且手指按压在屏幕上时,SDK会默认拦截所有相机位移动画,避免动画和用户当前触控操作冲突,这也是self.mapView.camera.ease无法在手指按压阶段立即执行的核心原因。
实现步骤
- 弃用地图SDK自带的长按回调,自行向地图控件挂载原生长按手势识别器:iOS端用
UILongPressGestureRecognizer,Android端用GestureDetector,将手势的cancelsTouchesInView(iOS)/触摸消费属性设为不打断地图原有手势响应。 - 调整手势监听逻辑:不要等手势结束状态再执行业务,当手势状态变为
began(即达到设置的长按时长阈值,比如0.5s,此时手指还未抬起),立刻获取触点对应的地图经纬度。 - 临时解除SDK动画拦截:触发相机移动前,先临时关闭地图所有手势交互权限,此时SDK会放开相机动画的调用限制。
- 执行
self.mapView.camera.ease移动相机到目标坐标,等动画执行完成后,再重新恢复地图的手势交互权限即可。
代码示例(iOS端)
// 向地图添加自定义长按手势 let longPress = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:))) longPress.minimumPressDuration = 0.5 // 自定义长按触发时长 longPress.cancelsTouchesInView = false mapView.addGestureRecognizer(longPress) @objc private func handleLongPress(_ gesture: UILongPressGestureRecognizer) { // 仅在长按刚触发时执行,不等手指抬起 guard gesture.state == .began else { return } let touchPoint = gesture.location(in: mapView) let targetCoord = mapView.convert(touchPoint, toCoordinateFrom: mapView) // 临时关闭交互解除动画拦截 mapView.isUserInteractionEnabled = false // 执行相机移动 let targetCamera = GMSCameraPosition(target: targetCoord, zoom: mapView.camera.zoom) mapView.camera.ease(to: targetCamera, duration: 0.3) { [weak self] _ in // 动画结束恢复交互 self?.mapView.isUserInteractionEnabled = true } }
Android端逻辑完全一致:不要用SDK自带的
OnMapLongClickListener(部分实现需要等手指抬起才回调),用GestureDetector监听onLongPress事件,回调触发时先调用map.getUiSettings().setAllGesturesEnabled(false)临时禁用手势,再调用animateCamera移动视角,动画结束后恢复手势权限即可。
内容的提问来源于stack exchange,提问作者BSK-Team
相关产品推荐
相关产品推荐

