html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形


Posted in HTML / CSS onJanuary 09, 2013

上一篇文章我讲了画矩形和圆形的方法,他们都有原生的canvas绘图函数可完成。而本文讲的圆角矩形则只有通过其他方法模拟出来。
一个正常的圆角矩形,我们先假设他四个角的圆角弧度一致——因为这样比较好画。我们动用把面拆成线条的能力,很容易就能发现圆角矩形其实是由4条钩子般的曲线组成。

html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形


提到钩子,如果你看过我介绍arcTo的文章,那么可能你一下就明白了这种图形就可以用arcTo画出来。
我讲arcTo的时候提过,arcTo有个特性就是,他的第2条切线延长也并不会对他画出的线条造成影响(在上文的最后部分),这也为我们画圆角矩形提供了方便,不用担心变形。
下面放出我在国外网站上发现的canvas画圆角矩形的方法,应该是效率最高的了。
复制代码
代码如下:

//圆角矩形
CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
if (w < 2 * r) r = w / 2;
if (h < 2 * r) r = h / 2;
this.beginPath();
this.moveTo(x+r, y);
this.arcTo(x+w, y, x+w, y+h, r);
this.arcTo(x+w, y+h, x, y+h, r);
this.arcTo(x, y+h, x, y, r);
this.arcTo(x, y, x+w, y, r);
// this.arcTo(x+r, y);
this.closePath();
return this;
}

此函数的参数,依次是x坐标,y坐标,宽度,高度,圆角半径。特别要注意最后这个参数——圆角半径。
此方法用了4次arcTo画出了一个圆角矩形,他的每个角的弧度都是一样的。此圆角矩形的坐标点也是和矩形一样的左上角,但他的起笔点可不是这里,而是:

html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形


你可以去掉其中的某条线,看看此方法的原理。
当然,提醒一下,不论画什么图形,都要记得闭合路径——closePath,避免留下隐患。

这个方法最后有个return this,是为了让你能使用链式语法,如:
ctx.roundRect(200,300,200,120,20).stroke();你不需要的话也可以去掉他。
如果你并不想扩充ContextRenderingContext2D原型,你也可以把这个方法另外做一个函数。
当时发现这个函数的时候,我连arcTo是什么都不知道,所以也没有记住是在哪个网站上发现的,反正不是我原创的,在此感谢作者。

在前文中我一直强调这个方法画出的圆角矩形每个角都是一致的,是因为css3中的border-radius可以很轻松的画出每个角甚至每个角的邻边圆弧不一致的圆角矩形,待我找找canvas中画不规则圆角矩形的办法吧,不过个人觉得挺难的。

HTML / CSS 相关文章推荐
使用CSS实现阅读进度条
Feb 27 HTML / CSS
CSS3五个技巧给你的网站带来出色的效果
Apr 02 HTML / CSS
让IE支持CSS3的不完全兼容方案
Sep 19 HTML / CSS
使用CSS Grid布局实现网格的流动
Dec 30 HTML / CSS
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
Mar 17 HTML / CSS
深入理解css属性的选择对动画性能的影响
Apr 20 HTML / CSS
关于css中margin的值和垂直外边距重叠问题
Oct 27 HTML / CSS
基于HTML5的WebSocket的实例代码
Aug 15 HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
Jun 11 HTML / CSS
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
Jan 09 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
May 07 HTML / CSS
HTML5页面中尝试调起APP功能
Sep 12 HTML / CSS
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
Jan 09 #HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
Jan 09 #HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
Jan 09 #HTML / CSS
You might like
PHP中$_SERVER的详细参数与说明
2008/07/29 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
javascript中的面向对象
2017/03/30 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
Python最长公共子串算法实例
2015/03/07 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
python开发前景如何
2020/06/11 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
总经理秘书工作职责
2013/12/26 职场文书
文明之星事迹材料
2014/05/09 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers