HTML5 CANVAS画图 beginPath和closePath
beginPath这个canvas函数我很早就讲过了,他的作用很简单,就是开始一段新路径,我们先来看下面的一小段代码:
var ctx = document.getElementById('cvs').getContext('2d'); ctx.beginPath(); ctx.moveTo(100.5,20.5); ctx.lineTo(200.5,20.5); ctx.stroke(); ctx.moveTo(100.5,40.5); ctx.lineTo(200.5,40.5) ctx.strokeStyle = '#f00'; ctx.stroke();
上面的代码会得到什么样的图形呢?是不是一条黑线一条红线呢?
从代码上看,我们的逻辑毫无问题,但结果是我们得到的是两条红线,并不是一黑一红。
如果你明白这是为什么,那后面的你就不用看了。这就是beginPath的重要性。
canvas中的绘制方法(如stroke,fill),都会以“上一次beginPath”之后的所有路径为基础进行绘制。比如上面的代码里面我stroke了两次,其实这两次都是以第一次beginPath后的所有路径为基础画的。也就是说第一条路径我们stroke了两下,第一下是黑的,第二下是红的,所以最终也是红的。
- 不管你用moveTo把画笔移动到哪里,只要不beginPath,那你一直都是在画一条路径。
- fillRect与strokeRect这种直接画出独立区域的函数,也不会打断当前的path.
如果你画出的图形和你想像的不一样,记得查看是否有合理的beginPath.
说到beginPath,就不得不提到closePath,两者是不是有很“紧”的联系呢?答案是几乎没有关系。
closePath的意思不是结束路径,而是关闭路径,它会试图从(MoveTo点之后)当前路径的终点连一条路径到起点,让整个路径闭合起来。但是,这并不意味着它之后的路径就是新路径了!
我们在上面的代码的第一个lineTo后面加上closePath,可以发现还是得到了两条红线。
但如果我们在第一个stroke后面加上beginPath,则会如愿得到一条黑线一条红线。
ctx.stroke(); ctx.beginPath(); //注意啦! ctx.moveTo(100.5,40.5); ctx.lineTo(200.5,40.5) ctx.strokeStyle = '#f00'; ctx.stroke();
总而言之,就是不要企图通过闭合现有路径来开始一条新路径,而开始一条新路径,以前的路径也不会闭合。
var ctx = document.getElementById('myCanvas').getContext('2d'); ctx.beginPath(); ctx.moveTo(100.5, 20.5); ctx.lineTo(200.5, 20.5); ctx.moveTo(110.5, 25.5); ctx.lineTo(210.5, 25.5); //ctx.stroke(); //ctx.beginPath(); //ctx.moveTo(100.5, 40.5); ctx.lineTo(200.5, 40.5) ctx.strokeStyle = '#f00'; ctx.closePath(); ctx.stroke();
结果如下:
ctx.moveTo(110.5, 25.5);与ctx.lineTo(200.5, 40.5)进行链接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!