Javascript 中的 Canvas 是基于路径的,同一时刻时能有一条路径而且肯定会有一条路径。
路径中可以包含很多条子路径,即 N 条子路径构成了一条路径。与路径相关的操作:
Context#beginPath() 用于创建一条新的路径,这也就意味着先前的路径丢失了,因为只能有一条路径。
moveTo/lineTo/... 之类的命令用于创建子路径。
说到 beginPath,就不得不提到 closePath,两者是不是有很“紧”的联系呢?答案是几乎没有关系。
closePath 的意思不是结束路径,而是闭合路径,它会试图从当前路径的终点连一条子路径到起点,让当前整个路径闭合起来。
但是,这并不意味着它之后的路径就是新路径了!
绘图指令有两种:
- 保留绘图指令(retained draw command),即不产生直接效果的指令,比如 moveTo, lineTo, (Curve)To, arc, rect。
- 直接绘图指令(direct draw command),这些指令既不需要创建新路径,也不对当前路径产生影响,比如 fill/strokeRect, fill/strokeText, drawImage, get/putImageData.
所以,关于路径的规则就是:
- 如果你使用 retained draw command,则需要 beginPath
- 如果你使用 direct draw command,则无需 beginPath
save() & restore()
save() & restore() 不会影响路径,影响的是什么?影响各种设置:
- 渲染设置 : strokeStyle / fillStyle / globalCompositeOperation / globalAlpha / lineWidth / font / textAlign/ shadow / …
- 变换(transform)设置 translate/scale/rotate/…
- 区域(clip)设置