HTML5中canvas中的beginPath()和closePath()的重要性


Posted in HTML / CSS onAugust 24, 2018

beginPath的作用很简单,就是开始一段新的路径,但在使用canvas绘图的过程中却非常重要

先来看一小段代码:

var ctx=document.getElementById("canvas").getContext("2d");
    ctx.beginPath();
    ctx.rect(150,150,100,100);
    ctx.fillStyle="green";
    ctx.fill();
    ctx.rect(0,0,100,100);
    ctx.fillStyle="yellow";
    ctx.fill();

我们的代码没有错误,但得到的却是两个边长100px的黄色的正方形,而不是一绿一黄,这是为什么呢?

事实上,canvas中的绘制方法(fill,stoke),都会以上一次“beginPath”之后的所有路径进行绘制,在上面的代码中第一个矩形fill了两次,第一次绿色,第二次黄色,所以得到了两个黄色矩形,同样的对于画线段,或其他曲线,图形,不管你moveTo到哪,只要你没有beiginPath,你都是在画一条路径。

如果你画的图形和你想象的不一致,记得查看一下beginPath。

谈到beginPath就不得不提一下closePath,事实上两者并无关系,closePath的意思是关闭路径,不是结束路径,它只是将路径的终点与起点相连,不是开始一个新路径。

我们在上面代码中第一个fill的后面添加一个closePath,得到的仍是两个黄色矩形。

但我们在后面添加一个beginPath,则得到两个不同颜色的矩形。

总而言之,不要试图通过闭合一段路径来开始新的路径,而且如果你不闭合路径,即使开始新的路径,其也不会闭合。

补充:canvas的Beginpath和Closepath理解

beginPath()方法

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 ( ) ;

其中的0.5是为了避免线条模糊问题。那么上面的代码会得到什么样的图形呢?是不是一条黑线一条红线呢?

从代码上看,我们的逻辑毫无问题,但结果是我们得到的是两条红线,并不是一黑一红。

如果你明白这是为什么,那后面的你就不用看了。这就是beginPath的重要性。

canvas中的绘制方法(如stroke,fill),都会以“上一次beginPath”之后的所有路径为基础进行绘制。比如上面的代码里面我stroke了两次,其实这两次都是以第一次beginPath后的所有路径为基础画的。也就是说第一条路径我们stroke了两下,第一下是黑的,第二下是红的,所以最终也是红的。

1.不管你用moveTo把画笔移动到哪里,只要不beginPath,那你一直都是在画一条路径。
2.fillRect与strokeRect这种直接画出独立区域的函数,也 不 会打断当前的path.

如果你画出的图形和你想像的不一样,记得查看是否有合理的beginPath.

————————————–

说到 beginPath ,就不得不提到 closePath ,两者是不是有很“紧”的联系呢?答案是 几乎没有关系 。

closePath的意思不是结束路径,而是 关闭 路径,它会试图从当前路径的终点连一条路径到起点,让整个路径闭合起来。但是,这并不意味着它之后的路径就是新路径了!

我们在上面的代码的第一个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 ( ) ;

总而言之,就是 不要企图通过闭合现有路径来开始一条新路径 ,而开始一条新路径,以前的路径也不会闭合。
 

HTML / CSS 相关文章推荐
CSS3 优势以及网页设计师如何使用CSS3技术
Jul 29 HTML / CSS
纯css3无js实现的Android Logo(有简单动画)
Jan 21 HTML / CSS
css3弹性盒模型(Flexbox)详细介绍
Oct 08 HTML / CSS
用CSS3绘制三角形的简单方法
Jul 17 HTML / CSS
详解CSS3中border-image的使用
Jul 18 HTML / CSS
使用CSS3美化HTML表单的技巧演示
May 17 HTML / CSS
CSS3 box-shadow属性实例详解
Jun 19 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
May 04 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
Jun 16 HTML / CSS
HTML5拖拉上传文件的简单实例
Jan 11 HTML / CSS
使用CSS3实现按钮悬停闪烁动态特效代码
Aug 30 HTML / CSS
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
Dec 24 HTML / CSS
Html5移动端弹幕动画实现示例代码
Aug 27 #HTML / CSS
Html5页面在微信端的分享的实现方法
Aug 30 #HTML / CSS
canvas粒子动画背景的实现示例
Sep 03 #HTML / CSS
html5中去掉input type date默认样式的方法
Sep 06 #HTML / CSS
html5新特性与用法大全
Sep 13 #HTML / CSS
HTML5新控件之日期和时间选择输入的实现代码
Sep 13 #HTML / CSS
Html5中的桌面通知Notification的实现
Sep 25 #HTML / CSS
You might like
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
详解Python迭代和迭代器
2016/03/28 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
详解Python文本操作相关模块
2017/06/22 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
python输入多行字符串的方法总结
2019/07/02 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
Django 解决由save方法引发的错误
2020/05/21 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
机电一体化求职信
2014/03/10 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript