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中transform变换模型的渲染
May 27 HTML / CSS
移动Web—CSS为Retina屏幕替换更高质量的图片
Dec 24 HTML / CSS
CSS3 linear-gradient线性渐变生成加号和减号的方法
Nov 21 HTML / CSS
HTML5如何实现元素拖拽
Mar 11 HTML / CSS
纯html5+css3下拉导航菜单实现代码
Mar 18 HTML / CSS
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
Jul 15 HTML / CSS
html5适合移动应用开发的12大特性
Mar 19 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
Jun 25 HTML / CSS
html5组织内容_动力节点Java学院整理
Jul 10 HTML / CSS
移动端html5模拟长按事件的实现方法
Sep 30 HTML / CSS
HTML5实现视频弹幕功能
Aug 09 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
Oct 19 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简单获取复选框值的方法
2016/05/11 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
JavaScript的Cookies
2008/01/16 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
Java中的类包括什么内容?设计时要注意哪些方面
2012/05/23 面试题
公司年会策划方案
2014/05/17 职场文书
婚前协议书范本两则
2014/10/16 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
迟到检讨书
2015/01/26 职场文书
欠款起诉书范文
2015/05/19 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技