地图轨迹回放时如何平滑移动Marker?
我在用高德地图做轨迹回放功能,现在是每隔1秒更新一次Marker的位置,但看起来特别卡顿,像“瞬移”一样。试过用marker.setPosition()直接设置新坐标,也试过加CSS transition,但都没用。
查了文档说可以用moveAlong,但我的轨迹点是动态加载的,不是一开始就全有的。有没有办法让Marker在两个点之间平滑移动?比如用requestAnimationFrame自己算插值?
function replayTrack(points) {
let index = 0;
const timer = setInterval(() => {
if (index >= points.length) {
clearInterval(timer);
return;
}
marker.setPosition(points[index]);
index++;
}, 1000);
}
首先我们得抛弃setInterval这种粗糙的定时器,改用requestAnimationFrame。然后在每次更新时,根据当前时间和目标位置来计算中间位置。
下面是一个改进版的代码示例:
这个方案有几个要点:
- 使用线性插值来计算中间位置,这样看起来更自然
- 把每段动画限制在1秒内完成(duration变量)
- 注意处理最后一个点的情况,避免数组越界
- 每次动画结束后再开始新的动画周期
比起简单的setPosition,这种方法能让Marker看起来是在连续移动,而不是瞬间跳跃。当然,实际应用中可能还需要考虑更多细节,比如不同路段的速度变化之类的。但这个基础框架应该能满足大部分需求了。
说实话,轨迹回放这种需求看似简单,真要做好还挺费劲的,尤其要考虑地图本身的缩放和平移操作对动画的影响。不过慢慢调调参数总能搞定的。
用高德自带的moveTo最省事:
如果你非要自己撸插值,用requestAnimationFrame也行,就是麻烦点:
动态加载的点也无所谓,每次拿到新点调moveTo就行,不用一开始全量加载。