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中Color的一些特性介绍
May 27 HTML / CSS
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
Feb 27 HTML / CSS
CSS3 实现童年的纸飞机
May 05 HTML / CSS
用css3实现转换过渡和动画效果
Mar 13 HTML / CSS
Html5 postMessage实现跨域消息传递
Mar 11 HTML / CSS
前端面试必备之html5的新特性
Sep 05 HTML / CSS
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
Jul 11 HTML / CSS
HTML5实现签到 功能
Oct 09 HTML / CSS
wordpress添加Html5的表单验证required方法小结
Aug 18 HTML / CSS
面试必问:圣杯布局和双飞翼布局的区别
May 13 HTML / CSS
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
Apr 19 HTML / CSS
HTML CSS 一个标签实现带动画的抖音LOGO
Apr 26 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
2006/12/14 PHP
说明的比较细的php 正则学习实例
2008/07/30 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
基于jquery的模态div层弹出效果
2010/08/21 Javascript
基于jquery的网页SELECT下拉框美化代码
2010/10/28 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
Python实现图像几何变换
2015/07/06 Python
Python表示矩阵的方法分析
2017/05/26 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
实践Vim配置python开发环境
2018/07/02 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
土地租赁意向书
2014/07/30 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
英语教师求职信范文
2015/03/20 职场文书
教师节寄语2015
2015/03/23 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技