Анимация маркеров
Вы можете добавлять анимацию к маркерам на карте:
- Движение по окружности.
- Прыжок (движение вверх-вниз).
- Движение по заданным координатам. Дополнительно вы можете добавить CSS-анимацию маркера.
- Анимацию пройденного пути с помощью Polyline.
- Анимацию HTML-маркера с помощью Lottie.
Чтобы добавить анимацию к маркеру, сначала добавьте объект Marker на карту и укажите координаты центра маркера:
const marker = new mapgl.Marker(map, {
coordinates: [55.31878, 25.23584],
});
Движение по окружности
Анимация движения маркера вокруг заданной точки выполняется с помощью изменения координат маркера на окружности. Для этого вычисляются новые координаты на основе текущего времени и угла поворота.
Чтобы добавить анимацию движения по окружности, используйте функцию animateCircle
:
function animateCircle(marker, centerCoords, radius, duration) {
const startTime = performance.now();
function frame(time) {
const elapsed = (time - startTime) % duration; // Время с начала текущей итерации анимации
const angle = (2 * Math.PI * elapsed) / duration; // Текущий угол в радианах
const newCoords = [
centerCoords[0] + radius * Math.cos(angle), // Вычисление долготы
centerCoords[1] + radius * Math.sin(angle), // Вычисление широты
];
marker.setCoordinates(newCoords); // Установка новых координат маркера
requestAnimationFrame(frame); // Запуск следующего кадра анимации
}
requestAnimationFrame(frame);
}
// Вызов функции анимации
animateCircle(marker, [55.31878, 25.23584], 0.01, 5000);
Укажите следующие параметры функции animateCircle
:
marker
: объект маркера, для которого будет добавлена анимация.centerCoords
: координаты центра окружности в формате[долгота, широта]
.radius
: радиус окружности в географических координатах (в градусах).duration
: длительность одного полного оборота в миллисекундах.
Прыжок
При анимации в виде прыжка маркер двигается вверх и вниз, создавая эффект подпрыгивания.
Для выполнения анимации вычисляется смещение маркера по вертикали относительно базовых координат маркера. Чтобы прыжок выглядел одинаково не зависимо от масштаба карты и корректно при изменении положения камеры, учитывается текущий масштаб карты.
Чтобы добавить анимацию в виде прыжка, используйте функцию animateJump
:
function animateJump(marker, map, baseCoords, amplitude, duration) {
const startTime = performance.now();
function frame(time) {
const elapsed = (time - startTime) % duration; // Время с начала текущей итерации анимации
const bounce = Math.sin((2 * Math.PI * elapsed) / duration) * amplitude; // Высота прыжка
// Преобразование географических координат в пиксельные
const basePixelCoords = map.project(baseCoords);
// Добавление смещения по оси Y (по вертикали) в пикселях
const newPixelCoords = [
basePixelCoords[0], // X остаётся без изменений
basePixelCoords[1] - bounce, // Уменьшение Y для прыжка вверх
];
// Преобразование пиксельных координат обратно в географические
const newGeoCoords = map.unproject(newPixelCoords);
// Установка новых координат маркера
marker.setCoordinates(newGeoCoords);
requestAnimationFrame(frame); // Запуск следующего кадра анимации
}
requestAnimationFrame(frame);
}
// Вызов функции анимации
animateJump(marker, map, [55.31878, 25.23584], 20, 1000);