Canvas画矩形路径为什么最后一条边不显示?
我在用Canvas画矩形路径时,明明设置了closePath,但最后一条边总是断开的。比如这样画:
function drawRect(ctx, x, y, w, h) {
ctx.beginPath();
ctx.moveTo(x, y);
ctx.lineTo(x + w, y);
ctx.lineTo(x + w, y + h);
ctx.lineTo(x, y + h);
ctx.closePath();
ctx.stroke();
}
运行后右边和底边连接处会有缺口,像被截断一样。试过把closePath换成ctx.lineTo(x,y)再stroke,反而正常了。这是不是路径绘制顺序的问题?
给你个改进版,把坐标都取整,复制过去试试:
这样处理后,路径的每个点都落在整数像素上,避免了亚像素渲染的问题。如果还要填充的话,效果会更明显。实在不行你也可以用rect方法,它底层做了优化处理:
这两种方式都能解决问题,看你具体需求选一个用就行。
最简单的解决方法是把起始坐标取整:
或者更高效的做法,直接用
ctx.rect(x, y, w, h),一行搞定,性能更好还不会出问题:rect方法底层做了优化,路径构建效率比手动四个lineTo高,而且闭合逻辑更可靠。别折腾moveTo和lineTo了,这种标准图形就用原生API。