这又是忘记调用 beginPath 的永恒问题。
每次调用 moveTo 和 lineTo 时,都会创建一个新的 *sub*path,该路径会添加到当前 Path 中。
然后,每次调用中风()时,当前路径,因此当第一次绘制最后添加的路径时,所有当前子路径都会重新绘制。
由于不透明度会累加,因此绘制一次的底线将具有 20% 不透明度 (lineWidth=0.2) 时,顶线将达到 100% 不透明度 (alpha=255)。
在第二个小提琴中,您仅描边一次,因此所有线条都有 20% 的不透明度,这对于 0.2 线宽来说是正确的。
所以:在绘制新图形之前使用 beginPath。
在这种情况下你有两个选择:
• 逐行绘制
或者
• 绘制一次路径,将所有线作为子路径。
(参见下面的代码)。
TIP:要获得干净的线条,请记住像素的中心位于每个像素的 (+0.5, +0.5) 坐标处,因此
一个“技巧”是在应用程序启动时平移 0.5, 0.5,然后仅使用圆角坐标和线宽.
1)逐行绘制
http://jsfiddle.net/gamealchemist/J6zzD/6/
var c = document.getElementById('c');
var ctx = c.getContext('2d');
ctx.translate(0.5, 0.5);
ctx.lineWidth = 1;
for (var y = 18; y < 300; y += 18) {
strokeLine(ctx, y);
}
function strokeLine(ctx, y) {
ctx.beginPath();
ctx.strokeStyle = 'red';
ctx.moveTo(0, y);
ctx.lineTo(300, y);
ctx.stroke();
}
2)绘制多个subPath:
(一笔画只能有一种颜色() )
http://jsfiddle.net/gamealchemist/J6zzD/7/
var c = document.getElementById('c');
var ctx = c.getContext('2d');
ctx.translate(0.5, 0.5);
ctx.lineWidth = 1;
ctx.strokeStyle = 'red';
ctx.beginPath();
for (var y = 18; y < 300; y += 18) {
addLineSubPath(ctx, y);
}
ctx.stroke();
function addLineSubPath(ctx, y) {
ctx.moveTo(0, y);
ctx.lineTo(300, y);
}