<<index.html>>javascript
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style type="text/css"> #canvas { border: 1px black solid; } </style> </head> <body> <canvas id="canvas" width="1000" height="400">您的浏览器不支持canvas</canvas> <input type="button" onclick="InitDraw()" value="draw"> <script type="text/javascript"> function InitDraw() { var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var ctx2 = canvas.getContext('2d'); var step; // var sAngle; // var eAngle; var x, y, r; var add, stepTime, counterClockwise; // 步进属性 step = 0; add = Math.PI * 2 / 100; stepTime = 20; // 随机圆属性 sAngle = 0; eAngle = sAngle + add; counterClockwise = false; x = Math.random() * 800 + 100; y = Math.random() * 200 + 100; r = Math.random() * 50 + 50; ctx.strokeStyle = "#" + (Math.random() * 0x1000000 << 0).toString(16); ctx.shadowColor = "#" + (Math.random() * 0x1000000 << 0).toString(16); console.log(ctx.strokeStyle); console.log(ctx2.strokeStyle); ctx.lineWidth = 1.0; ctx.shadowOffsetX = 0; ctx.shadowOffsetY = 0; ctx.shadowBlur = 10; // 画圆 var drawID = setInterval(Draw, stepTime); function Draw() { if (step < 100) { // 绘制路径并画 ctx.beginPath(); ctx.arc(x, y, r, sAngle, eAngle, counterClockwise); ctx.stroke(); ctx.closePath(); // 步进 sAngle = eAngle; eAngle += add; // console.log("drawID:" + drawID + ",step:" + step); // console.log(ctx.strokeStyle); step++; } else { clearInterval(drawID); } } } </script> </body> </html>
在执行绘图过程当中持续变化的参数是step,sAngle,eAngle,再次调用时回到函数InitDraw();从新定义六个全局变量以及画笔样式,则从新开始绘图。上一个step和画笔样式都停留在按下button的一刻 css
在控制台输出状况能够看到,当起始位置为全局变量时相互干扰的很是厉害,但由于step是局部变量,调用的是不一样的副本,最后两个圈均执行到了99。而且能够看到控制台中drawID是间隔出现的,对两次setInterval方法轮流执行,也就形成了sAngle位置是跳跃的虚点。 html
但要注意的是在该示例中共用同一个画布和联系(ctx),在这里画笔的颜色和样式被刷新成为新的。那么应该如何在同一画布中同时绘画不一样样式? java
在第二次点击出现的圈绘到约半圈时中止 canvas
点击button从新执行InitDraw();step=0; 从打印信息能够看到两个不一样的setInterval方法对step变量相互干扰,直到step有机会到达99时中止绘图。 浏览器
在同一个画布中调用获取两个Context,但经过输出能够看到每一个画布只有一个对应的Contextdom
通过几个Demo的分析获得如下结论: 函数
遗留问题: 测试