鼠标框选时矩形区域出现断层怎么办?
大家好,我在用canvas做鼠标框选功能时遇到个怪问题。当快速拖动鼠标画选区时,矩形边框会出现断断续续的缺口,特别是拖动速度越快断层越多,这是为什么呢?
我尝试用rect方法画矩形,监听mousedown和mousemove:
let startX, startY;
canvas.addEventListener('mousedown', (e) => {
startX = e.clientX;
startY = e.clientY;
canvas.addEventListener('mousemove', drawRect);
});
function drawRect(e) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.strokeRect(
startX,
startY,
e.clientX - startX,
e.clientY - startY
);
}
这样写的话拖动过程中矩形会不断重绘,但拖动速度快的时候边缘就会出现锯齿状的断层。试过给canvas加抗锯齿ctx.imageSmoothingEnabled = true没用,调整lineWidth到1.5px反而更明显。是不是跟绘制频率有关?
关键点:
1. 把矩形数据存到变量里,避免每次重绘时计算出错。
2.
redrawCanvas函数负责清屏和重绘,保证画面一致性。3. 加了个
isDrawing标志位,防止不必要的重绘。这样改了应该就不会有断层了。如果还卡,可能是浏览器性能问题,那就没办法了 😅