在填充绘制路径时,getContext.fill()方法有两个参数,当为'evenodd'时,重叠的部分去掉,为啥在我这里不行,请问如何修改呢?
<canvas id=c></canvas>
<script>
var w = c.width = window.innerWidth,
h = c.height = window.innerHeight,
ctx = c.getContext('2d'),
offset = 0;
points = [];
function smoothLine(points) {
ctx.fillStyle="red";
ctx.fill('evenodd'); // 主要是这里;
ctx.lineWidth = 3;
ctx.strokeStyle = '#eee';
ctx.lineTo(points[points.length - 1].x, points[points.length - 1].y);
ctx.setLineDash([5, 4, 3]);
march();
ctx.lineDashOffset = offset;
ctx.stroke();
}
function march() {
offset++;
if (offset > 15) {
offset = 0;
}
setTimeout(march, 20);
}
c.onmousedown = function (e) {
points.push({x: e.clientX, y: e.clientY});
ctx.fill('evenodd');
c.onmousemove = function (e) {
points.push({x: e.clientX, y: e.clientY});
smoothLine(points);
};
c.onmouseup = function () {
ctx.closePath()
c.onmousemove = null;
c.onmouseup = null;
};
};
</script>
是对“路径填充”这件事的理解问题。路径绘制其实包含开始路径绘制,路径绘制,结束路径绘制三个状态的,而每次执行fill之后相当于结束路径绘制了。
fill('evenodd')是在单次填充时候进行重叠对消,但是本次fill并不会再对上一次fill的结果进行修改的。
正确代码
但是以下代码中间打断了路径,效果就不一样了。