HTML5 Canvas 起步(2) - 路径


Posted in HTML / CSS onMay 12, 2009

这篇将要介绍一下 Canvas 中的基本图形。

图形的基础 - 路径

在 Canvas 中,所有基本图形都是以路径为基础的,也就是说,我们在调用 2dContext 的 lineTo、rect 等方法时,其实就是往已经的 context 路径集合中再添加一些路径点,在最后使用 fill 或 stroke 方法进行绘制时,都是依据这些路径点来进行填充或画线。

在每次开始绘制路径前,都应该使用 context.beginPath() 方法来告诉 Context 对象开始绘制一个新的路径,否则接下来绘制的路径会与之前绘制的路径叠加,在填充或画边框时就会出现问题。在绘制完成路径后,可以直接使用 context.closePath() 方法来关闭路径,或者手动关闭路径。另外,如果在填充时路径没有关闭,那么 Context 会自动调用 closePath 方法将路径关闭。

基本路径方法

1. beginPath, closePath

这两个方法在前面已经介绍过,分别用来通知 Context 开始一个新的路径和关闭当前的路径。

在 Canvas 中使用路径时,应该要保持一个良好的习惯,每次开始绘制路径前都要调用一次 beginPath 方法,否则画出来的效果难看不说,还会严重影响性能。

在下面这张图中,左边的图形在每次绘制矩形前都调用了一次 beginPath 来清除之前的路径并重新开始绘制新的路径,而后面的图形则就只在绘制所有图形前调用了一次 beginPath 来清除路径,因此,虽然这里是使用的边框色是 #666,但是右边的图形颜色比左边的深一些,因为每次使用 stroke 绘制边框时,会把之前的路径再次绘制一遍,叠加起来颜色就比原来深一些。

HTML5 Canvas 起步(2) - 路径


提示:您可以先修改部分代码再运行

在 Context 中路径数较少时,如果不考虑显示效果,性能上还可以接受,但是如果 Context 中的路径数很多时,在开始绘制新路径前不使用 beginPath 的话,因为每次绘制都要将之前的路径重新绘制一遍,这时性能会以指数下降。

因此,除非有特殊需要,每次开始绘制路径前都要调用 beginPath 来开始新路径。

2. 移动与直线 moveTo, lineTo, rect

HTML5 Canvas 起步(2) - 路径


提示:您可以先修改部分代码再运行

void moveTo(in float x, in float y);

在 Canvas 中绘制路径,一般是不需要指定起点的,默认的起点就是上一次绘制路径的终点,因此,如果需要指定起点的话,就需要使用 moveTo 方法来指定要移动到的位置。

void lineTo(in float x, in float y);

lineTo 方法则是绘制一条直接路径到指定的位置。在调用完 lineTo 方法后,Context 内部的绘制起点会移动到直线的终点。

void rect(in float x, in float y, in float w, in float h);

rect 方法用来绘制一个矩形路径,通过参数指定左上角位置以及宽和高。在调用 rect 后,Context 的绘制起点会移动到 rect 绘制的矩形的左上角。

rect 方法与后面要介绍的 arc 方法与其他路径方法有一点不同,它们是使用参数指定起点的,而不是使用 Context 内部维护的起点。

3. 曲线 arcTo, arc, quadraticCurveTo, bezierCurveTo

void arcTo(in float x1, in float y1, in float x2, in float y2, in float radius);

按照 WHATWG 文档的说明,这个方法是画一个与两条射线相切的的圆弧,两条射线其中一条为穿过 Context 绘制起点,终点为 (x1, y1),另外一条为穿过 (x2, y2),终点为 (x1, y1),这条圆弧为最小的与这两条射线相切的圆弧。在调用完 arcTo 方法后,将 圆弧与 射线 (x1, y1)-(x2, y2) 的切点添加到当前路径中,做为下次绘制的起点。

在测试中发现,Firefox 和 Opera 目前对这个方法的支持并不好,只有 Chrome 和 Safari 4 能绘制出正确的路径。

HTML5 Canvas 起步(2) - 路径

图中的的两条灰色直线是偏移 4 个像素后的两条射线所在的位置。


提示:您可以先修改部分代码再运行

void arc(in float x, in float y, in float radius, in float startAngle, in float endAngle, in boolean anticlockwise);

arc 方法用来绘制一段圆弧路径,通过圆心位置、起始弧度、终止弧度来指定圆弧的位置和大小,这个方法也依赖于 Context 维护的绘制起点。而在画圆弧时的旋转方向则由最后一个参数 anticlockwise 来指定,如果为 true 就是逆时针,false 则为顺时针。

void quadraticCurveTo(in float cpx, in float cpy, in float x, in float y);

quadraticCurveTo 方法用来绘制二次样条曲线路径,参数中 cpx 与 cpy 指定控制点的位置,x 和 y 指定终点的位置,起点则是由 Context 维护的绘制起点。

void bezierCurveTo(in float cp1x, in float cp1y, in float cp2x, in float cp2y, in float x, in float y);

bezierCurveTo 方法用来绘制贝塞尔曲线路径,它与 quadraticCurveTo 相似,不过贝塞尔曲线有两个控制点,因此参数中的 cp1x, cp1y, cp2x, cp2y 用来指定两个控制点的位置,而 x 和 y 指定绺的位置。

HTML5 Canvas 起步(2) - 路径


提示:您可以先修改部分代码再运行

4. fill, stroke, clip

fill 与 stroke 这两个方法很好理解,分别用来填充路径与绘制路径线条。

clip 方法用来给 Canvas 设置一个剪辑区域,在调用 clip 方法之后的代码只对这个设定的剪辑区域有效,不会影响其他地方,这个方法在要进行局部更新时很有用。默认情况下,剪辑区域是一个左上角在 (0, 0),宽和高分别等于 Canvas 元素的宽和高的矩形。

HTML5 Canvas 起步(2) - 路径

在画这个图时,虽然两次都是使用 fillRect(0, 0, 100, 100) 填充了一个 100x100 大小矩形,但是显示的结果却是第二次填充的只是中间的一小块,这是因为在两次填充之间使用 clip 方法设定了剪辑区域,这样第二次填充时只会影响到所设定的中间那一小部分区域。


提示:您可以先修改部分代码再运行

5. clearRect, fillRect, strokeRect

这三个方法并不是路径方法,而是用来直接处理 Canvas 上的内容,相当于 Canvas 的背景,调用这三个方法也不会影响 Context 绘图的起点。

要清除 Canvas 上的所有内容时,可以直接调用 context.clearRect(0, 0, width, height) 来直接清除,而不需要使用路径方法绘制一个与 Canvas 同等大小的矩形路径再使用 fill 方法去清除。

结语

通过 Canvas 的路径方法,可以使用 Canvas 处理一些简单的矢量图形,这样在缩放时也不会失真。不过 Canvas 的路径方法也不是很强大,至少连个椭圆的路径都没有……

这篇写得有点长了,Cnavas 中路径相关的内容就写这么多,后面再讲讲 Canvas 其他的东西。

参考资料

1. The Canvas Element, WHATWG

HTML / CSS 相关文章推荐
CSS3旋转——彩色扇子兼容firefox浏览器
Jun 04 HTML / CSS
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
Apr 26 HTML / CSS
css3动画 小球滚动 js控制动画暂停
Nov 29 HTML / CSS
CSS3实现div从下往上滑入滑出效果示例
Apr 28 HTML / CSS
CSS3 实现的缩略图悬停效果
Dec 09 HTML / CSS
canvas实现图片马赛克的示例代码
Mar 26 HTML / CSS
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
Jan 03 HTML / CSS
html5 canvas fillRect坐标和大小的问题解决方法
Mar 26 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
Jul 26 HTML / CSS
使用phonegap进行本地存储的实现方法
Mar 31 HTML / CSS
可能这些是你想要的H5软键盘兼容方案(小结)
Apr 23 HTML / CSS
CSS中使用grid布局实现一套模板多种布局
Jul 15 HTML / CSS
HTML5 Canvas 起步(1) - 基本概念
May 12 #HTML / CSS
W3C公布最新的HTML5标准草案
Oct 17 #HTML / CSS
HTML5中的新元素介绍
Oct 17 #HTML / CSS
自定义html标记替换html5新增元素
Oct 17 #HTML / CSS
HTML5的结构和语义(1):前言
Oct 17 #HTML / CSS
HTML5的结构和语义(3):语义性的块级元素
Oct 17 #HTML / CSS
HTML5的结构和语义(2):结构
Oct 17 #HTML / CSS
You might like
php加速器eAccelerator的配置参数、API详解
2014/05/05 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
详解vue路由
2020/08/05 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
django 修改server端口号的方法
2018/05/14 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
路政管理专业个人自荐信范文
2013/11/30 职场文书
自荐信如何制作?
2014/02/21 职场文书
高考备战决心书
2014/03/11 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
驻村工作先进事迹
2014/08/14 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
学期个人工作总结
2015/02/13 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL