beginPath

绘制路径必须添加 beginPath()。它标志着一个画笔在画布中哪个地方开始画起。没有它,新起的画笔位置必定与上一次画笔结束的位置相连。

// 第一个半圆
ctx.arc(60, 80, 50, 0, Math.PI, true);
ctx.fillStyle = 'gold';
ctx.fill();
ctx.strokeStyle = 'red';
ctx.stroke(); // 第二个半圆
ctx.arc(240, 200, 50, 0, Math.PI, false);
ctx.fillStyle = 'gold';
ctx.fill();
ctx.strokeStyle = 'green';
ctx.stroke();

可以看到半圆的两个端点与另一个半圆的两个端点互连起来了,如果不用 beginPath(),画布就无法确定画笔新的起始点在哪里,默认就连起来绘制路径。就好像是我们写连笔字一样,笔画与笔画之间相连不断。

当我们在每一个新的画笔开始前写上 beginPath() 函数后,最终效果如下图:

closePath

一般情况下,beginPath() 和 closePath() 是搭配使用的,就是说,画笔从开始绘制路径结束之后,画笔回到起始点。就像是我们用完一件物品之后,要把它换回到原来的地方一样。

利用 closePath(),我们可以用绘制一个三角形:

ctx.beginPath();
ctx.moveTo(20, 20);
ctx.lineTo(100, 140);
ctx.lineTo(20, 140);
ctx.closePath(); // 画笔置于起始位置,(20, 20)
ctx.stroke();

其实也可以不用 closePath() 把画笔置于起始位置,可以用 ctx.lineTo(20, 20); 继续把路径延续下去。也就是说,closePath() 在路径中可以被省略。

stroke

stroke() 函数也是绘制路径的关键,图形的绘制由它来完成,在此之前我们要确定好路径的起始坐标以及结束坐标即可。

ctx.beginPath();
ctx.arc(150, 150, 100, 0, Math.PI * 2, true);

因为没有调用 stroke() 函数完成路径的绘制,所以画布中什么图形都没有出现:

补全这个关键的函数之后,画布出现了圆形:

最新文章

  1. NOIp2016 Day1&Day2 解题报告
  2. 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
  3. git学习之冲突解决办法
  4. Android版本更新之本地数据库更新
  5. C#通过RFC调用SAP
  6. hdu 2892 Area
  7. C语言内存分配机制
  8. nginx 配置.json文件直接访问
  9. C++二维数组动态内存分配
  10. loadrunner 与Md5
  11. HDU 1247
  12. pthread_t结构的定义
  13. C语言对象化编程
  14. Google Summer of Code 建议被接收的5个技巧
  15. C++类的存储(部分可用与c的结构体)
  16. 清北澡堂 Day 3 上午
  17. Android--Menus
  18. Tomcat Cluster
  19. 「HNOI2016」最小公倍数
  20. redis命令参考和redis文档中文翻译版

热门文章

  1. 【Shell案例】【小数点scale&bc】14、求平均值
  2. Blazor组件自做十二 : Blazor Pdf Reader PDF阅读器 组件 (草稿)
  3. Day33:String类及其常用方法详解
  4. Linux—软件管理
  5. hook详解和应用
  6. 数据结构 传统链表实现与Linux内核链表
  7. Vue + Element 自定义上传封面组件
  8. 数论专项复习(一)扩展欧几里得算法(exgcd)
  9. python读取kafka,输出到Vertica数据库
  10. Unity之屏幕自适应