| | |
| | | const markViewportFitSyncing = useCallback(() => { |
| | | globalFitSyncRef.current = true; |
| | | }, []); |
| | | // 用户手势进行中标记:从 regionchange 'begin'(用户拖拽/缩放手势) 到 'end' 之间为 true。 |
| | | // 供平滑运动在手势期间暂停车辆位置回灌,避免高频 setState 触发重渲染把受控相机弹回。 |
| | | const userGestureActiveRef = useRef(false); |
| | | // 经纬度 setter:更新 state 触发渲染的同时同步记录最新值,保证 ref 始终为最新(兼容函数式更新) |
| | | const setLatitude = useCallback((value: number | null | ((prev: number | null) => number | null)) => { |
| | | setLatitudeState((prev) => { |
| | |
| | | setRouteDuration, |
| | | setVehicleDirection, |
| | | setVehicleMoveAlongPoints, |
| | | updateVehicleLocationThrottled: vehicleState.updateVehicleLocationThrottled |
| | | updateVehicleLocationThrottled: vehicleState.updateVehicleLocationThrottled, |
| | | getUserGestureActive: () => userGestureActiveRef.current |
| | | }); |
| | | |
| | | useEffect(() => { |
| | |
| | | // 避免受控 <Map scale={mapScale}> 与原生实际缩放漂移,影响后续视口编排判断。 |
| | | const causedBy = String(e?.causedBy || e?.detail?.causedBy || '').toLowerCase(); |
| | | const eventType = String(e?.type || e?.detail?.type || '').toLowerCase(); |
| | | // 维护用户手势进行中标记:手势 begin 置位、end 复位,供平滑运动在手势期间暂停车辆位置回灌。 |
| | | const isUserGesture = causedBy === 'scale' || causedBy === 'drag' || causedBy === 'gesture'; |
| | | if (eventType === 'begin') { |
| | | if (isUserGesture) { |
| | | userGestureActiveRef.current = true; |
| | | } |
| | | } else if (eventType === 'end' && isUserGesture) { |
| | | // 仅用户手势(gesture/drag/scale)的 end 才复位;手势期间穿插的程序化 update 事件 |
| | | // (causedBy='update') 的 end 不应清除标记,否则会在用户仍在操作时提前恢复补帧导致弹回。 |
| | | userGestureActiveRef.current = false; |
| | | } |
| | | if (eventType === 'end' && (causedBy === 'scale' || causedBy === 'drag' || causedBy === 'gesture')) { |
| | | notifyUserMapGesture(); |
| | | |