как сделать так, чтобы камера реагирующей нативной карты анимировалась при движении маркера, но должна быть в то же время
я использую React-native-maps с картами Google на Android
и мне нужна камера карта анимированная, маркер перемещается одновременно
но всегда маркер перемещается, а карта следует за ним, поэтому между картой и маркером есть задержка, также я хочу, чтобы маркер всегда находился в нижней части экрана
animate_point для анимации камеры с использованием координат облака и animate_point_GPS с использованием координат GPS
это компонент карты
как сделать так, чтобы камера реагирующей нативной карты анимировалась при движении маркера, но должна быть в то же время я использую React-native-maps с картами Google на Android и мне нужна камера карта анимированная, маркер перемещается одновременно но всегда маркер перемещается, а карта следует за ним, поэтому между картой и маркером есть задержка, также я хочу, чтобы маркер всегда находился в нижней части экрана animate_point для анимации камеры с использованием координат облака и animate_point_GPS с использованием координат GPS это компонент карты [code] export default function MapUI() { const { authData } = useContext(AuthContext); const { gpsStatus, setGPSStatus } = useContext(AuthContext); const { mapLayer, setMapLayer } = useContext(AuthContext); const { positiveRCM, setPositiveRCM } = useContext(AuthContext);
const [token, setToken] = useState(); const [loading, setLoading] = useState(true); const [coordinate, setCoordinate] = useState(null); const mapRef = useRef(null); const [markersMeasurement, setMarkersMeasurement] = useState([]); const [prevDirection, setPrevDirection] = useState(null); // State to store previous direction
// WebSocket event handler const onMessage = (event) => { try { const data = JSON.parse(event.data); if (data.type === "coordinate" && data.device == authData.DeviceID) { // Update coordinate state with the received data if (!gpsStatus) { Updatecoordinate( data?.latitude, data?.longitude, data?.azimuth, data?.speed ); } } } catch (error) { console.error("Error parsing WebSocket data:", error); } }; /** * control the permission */ useEffect(() => { setToken(authData.TOKEN); setGPSStatus(gpsStatus); setMapLayer(mapLayer); setPositiveRCM(positiveRCM); }, []);
/** * control the switch between GPS and cloud */ useEffect(() => { // Wait for a short delay before checking gpsStatus const timeoutId = setTimeout(() => { if (gpsStatus) { getLocation(); //getLocation() } else { getCoordinates(); } }, 500); // Adjust the delay time as needed
// Clean up the timeout to avoid memory leaks return () => clearTimeout(timeoutId); }, [gpsStatus]);
/** * control the switch between GPS and cloud */ useEffect(() => { if (gpsStatus) { const intervalId = setInterval(async () => { try { const location = await Location.getCurrentPositionAsync({ accuracy: Location.Accuracy.Highest, });
/** * */ const animate_point_GPS = async (newCoordinate) => { let duration = 0; const heading = newCoordinate?.azimuth; const headingChanged = Math.abs(heading - prevDirection) > 10; // Define a threshold for significant change headingChanged && setPrevDirection(heading); // Update previous direction
if (newCoordinate?.speed > 100) { duration = 1100; } else if (newCoordinate?.speed > 50) { duration = 900; } else { duration = 1100; } // Animate camera to the new coordinates mapRef?.current?.animateCamera( { heading: headingChanged ? heading : prevDirection, center: { latitude: newCoordinate.latitude, longitude: newCoordinate.longitude, },
pitch: 55, }, { duration: duration } ); };
/** * get current location using GPS */ const getLocation = async () => { setLoading(true); let { status } = await Location.requestForegroundPermissionsAsync(); if (status !== "granted") { console.error("Permission to access location was denied"); return; }