参考博文:
Html5 canvas画图教程17:论beginPath的重要性
先看两个例子
例1:
结果:
例2:去掉第2个beginPath()
<canvas> 您的浏览器不支持 HTML5 canvas 标签。 </canvas> <script> var ctx = document.getElementById("myCanvas").getContext('2d'); ctx.beginPath(); ctx.moveTo(100.5,20.5);//① ctx.lineTo(200.5,20.5);//② ctx.strokeStyle = 'black';//默认strokeStyle='black', lineWidth=1, 此处可省略 ctx.stroke(); ctx.moveTo(100.5,40.5);//③ ctx.lineTo(200.5,40.5)//④ ctx.strokeStyle = 'red'; ctx.stroke(); </script>结果:
1. beginPath
2. closePath
对于绘制多段弧,看下面几个例子:
例3:
var context = document.getElementById("myCanvas").getContext('2d'); context.strokeStyle="#005588"; for (var i = 0; i < 10; i ++){ context.beginPath(); context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10); context.closePath(); context.stroke(); }结果:
例4:在例3的基础上只去掉closePath()
var context = document.getElementById("myCanvas").getContext('2d'); context.strokeStyle="#005588"; for (var i = 0; i < 10; i ++){ context.beginPath(); context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10); //context.closePath(); context.stroke(); }结果:
例5:在例3的基础上去掉beginPath()和closePath()
var context = document.getElementById("myCanvas").getContext('2d'); context.strokeStyle="#005588"; for (var i = 0; i < 10; i ++){ //context.beginPath(); context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10); //context.closePath(); context.stroke(); }结果:
可见,在这种情况下,每个弧画完都会连到下一个弧的起点
例6:在例3的基础上只去掉beginPath()
var context = document.getElementById("myCanvas").getContext('2d'); context.strokeStyle="#005588"; for (var i = 0; i < 10; i ++){ //context.beginPath(); context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10); context.closePath(); context.stroke(); }结果:
这样看不太清晰,我们将i < 10改为i < 3,只显示前三个:
可见,在这种情况下,每个弧画完都会先回到第一个弧的起点,然后再连到下一个弧的起点
例7:在例3的基础上将stroke()改为fill()
var context = document.getElementById("myCanvas").getContext('2d'); context.fillStyle="#005588"; for (var i = 0; i < 10; i ++){ context.beginPath(); context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10); //context.closePath(); context.fill(); }结果:
例8:在例7的基础上去掉closePath()
var context = document.getElementById("myCanvas").getContext('2d'); context.fillStyle="#005588"; for (var i = 0; i < 10; i ++){ context.beginPath(); context.arc(50 + i*100,60,40,0,2*Math.PI*(i+1)/10); context.closePath(); context.fill(); }结果:
比较例7和例8可知:
无论是否closePath(),结果都一样。
因为closePath()对于fill()是没有用的:无论是否closePath(),调用fill()时,canvas会自动把没有封闭的路径首尾相连,之后进行填充