怎么用JS准确记录并绘制鼠标移动轨迹?
我在做一个画板功能,想实时记录鼠标移动的路径然后画出来,但发现轨迹特别卡顿,而且点太稀疏连不成线。我试过在 mousemove 里直接 push 坐标到数组,但效果很差。
有没有办法平滑一点地采集轨迹?或者是不是应该用 requestAnimationFrame 配合?下面是我目前的代码:
const points = [];
document.addEventListener('mousemove', (e) => {
points.push({ x: e.clientX, y: e.clientY });
// 然后用 canvas 把这些点连起来
});
这里有一个改进的方案,使用一个中间变量来缓存鼠标位置,然后在 requestAnimationFrame 的回调里更新 canvas。这样可以有效降低绘制频率,让轨迹更加平滑。
记得给 canvas 设置宽度和高度,并且初始路径要用 moveTo 开始,不然 lineTo 会从 0,0 开始画线。这样处理后应该能解决卡顿和轨迹不连贯的问题。
核心解决思路:记录所有点,绘制时用二次贝塞尔曲线连接相邻点的中点,这样轨迹自动就平滑了。
直接上代码:
这个方案的原理很简单:取相邻两点的中点作为贝塞尔曲线的控制点,起点是前一个中点,终点是当前点和下一点的中点。这样画出来的线比直接 lineTo 平滑得多。
如果还需要更高级的平滑效果,可以考虑记录时间戳,根据鼠标移动速度动态调整采样率,不过上面这个方案日常使用已经足够了,拿去改改就行。