一般绘图的方式有两种,即填充和描边,前面的文章已经讲了描边的方法stroke,本文就讲一下Canvas中填充图形的方法。

填充即fill(),很直白吧?而且和strokeStyle表示描边样式一样,fillStyle即表示填充样式。

ctx.fillStyle = '颜色';

默认的填充样式是不透明的黑色

提问:未闭合的路径可以填充吗

可以。Canvas会从你当前路径的终点直接连接到起点,然后填充。如图:

但你可以发现,最后一段没有描边

记得我们前一篇文章用4条线画了一个正方形,但canvas不会这么差劲,连直接绘制矩形的函数都没有。你可以使用fillRect()直接填充一个矩形:

ctx.fillRect(x,y,width,height);

这里的x,y是指矩形的左上角起点的坐标,记住。

说到fillRect,就不得不提strokeRect,你猜对了,他的意思就是直接描边出一个矩形。

还有fillText与strokeText,至于作用嘛,你可能都猜到了,我这里先不讲,大家先预习吧。

Canvas填充渐变色

在Canvas中,渐变色同样分为两种,即线性渐变径向渐变,而且创建他们的方法也是独立的。我们先看如何创建线性渐变。

创建线性渐变=createLinearGradient——看,依然很直接的单词。他的语法如下:

createLinearGradient(x1,y1,x2,y2)

有4个参数呢!看起来好复杂,其实这个挺简单的,因为我们前面已经说了,平面世界里的一个点是由x坐标和y坐标确定的。所以,x1,y1就是表示线性渐变的起点坐标,x2,y2就表示终点坐标。

这样做的好处很明显,如果我们想创建一个斜着的线性渐变,很方便。但我们先创建一个水平的线性渐变试试吧。

var linear = ctx.createLinearGradient(100,100,200,100);

渐变好像创建了,那么我们可以填充了吗?————这个渐变是空的,没有颜色。

往渐变条里加颜色的方法是addColorStop(位置,颜色).但要注意了,这个addColorStop不是加在画笔上,而是加在前面的那个保存渐变的变量上,我这里是linear.

var linear = ctx.createLinearGradient(100,100,200,100);
linear.addColorStop(0,'#fff');
linear.addColorStop(0.5,'#f0f');
linear.addColorStop(1,'#333');

我这里用了3个addColorStop,即为渐变条加上了3个颜色。

注意:addColorStop的位置参数,永远是介于0-1之间的数字,可以是两位小数,表示百分比。他没法接收’3px’这样的参数。

这时候,我们就可以填充渐变色了,但我们必须先把定义好的渐变赋给fillStyle.

var linear = ctx.createLinearGradient(100,100,200,100);
linear.addColorStop(0,'#fff');
linear.addColorStop(0.5,'#f0f');
linear.addColorStop(1,'#333');
ctx.fillStyle = linear; //把渐变赋给填充样式
ctx.fillRect(100,100,100,100);
ctx.stroke();//无用

注意,fillRect与strokeRect画出的都是独立的路径,如上面的代码,在fillRect后调用描边,并不会把刚刚画出的矩形描边,strokeRect同理。

经过测试后,发现了一个很蛋疼的问题,就是线性渐变的坐标是相对于整个Canvas范围而言的。比如我这里,我的线性渐变起点就是100,100,如果我画了一个矩形在0,0的位置,用这个渐变来填充,就会发现没有填充——因为我的渐变的范围根本就超过了矩形的范围。

这真是一个坑爹的设定。

提问:渐变起点之前与渐变终点之后还会填充颜色吗

会。起点之前的颜色就是起点色,终点之后的颜色一直是终点色。

如何终止终点色,你可以在结束色之后再填一个透明的结束色。如:

linear.addColorStop(0.99,'#333');
linear.addColorStop(1,'rgba(51,51,51,0)');

依照前面的计划,我再建一个倾斜的线性渐变试试。只需要改createLinearGradient的参数即可.

var linear = ctx.createLinearGradient(100,100,200,200);

效果如图:

然后,让我们来试试径向渐变(圆形渐变)。与createLinearGradient类似,创建径向渐变的方法是:createRadialGradient,但他们的参数可大不相同:

createRadialGradient(x1,y1,r1,x2,y2,r2)

其中的x1,y1,x2,y2依旧表示起点和终点,不过这里的起点和终点都是一个圆,而x,y则是圆心的坐标。所以,r1与r2分别是起点圆的半径和终点圆的半径。如图:

在我的印象中,貌似径向渐变就是一个圆,圆心就是起点,圆的半径就是终点。但canvas里面的径向渐变竟然搞的不一样了,起点一个圆,终点一个圆,和我的理解有差距。

我们从最简单的做起。首先,做一个很正规的径向渐变,即渐变圆形的圆心就是渐变的起点。由于正规的径向渐变,渐变中心即圆心,所以我们应该尽量避免发生偏斜。那么,我们把终点圆的圆心与起点圆的圆心重合吧?

var radial = ctx.createRadialGradient(55,55,10,55,55,55); //重合的圆心坐标
radial.addColorStop(0,'#fff');
radial.addColorStop(0.5,'#ff0');
radial.addColorStop(0.9,'#555');
radial.addColorStop(1,'#f00');

这里我设置的径向渐变起点圆和终点圆的圆心坐标相同,而起点圆半径为10,终点圆半径为55.最后画出的径向渐变范围是一个宽高110的圆形,说明渐变范围以终点圆的范围为准。

(可以看到终点圆范围之外还是有颜色,这个颜色就是终点色,但是,如果你企图使用radial.addColorStop(1.5,’#0f0′);这样来定义渐变范围之外的颜色,你还是会收到一个错误).

那么,起点圆的半径有什么用呢?——本来正常的径向渐变的中心(姑且称之为“变心”…吧)只是一个点,不应该是一个圆的。其实我们没错,这个起点圆就相当于一个圆点而已,只是可能比较大。

让我们把起点圆的半径变得很大,接近于终点圆的半径:

var radial = ctx.createRadialGradient(55,55,50,55,55,55); //很接近

其他的colorStop都不变,然后图形就变成了这个样子。

也就是说,canvas中径向渐变的起点色,是从起点圆的范围之外绘制的,而起点圆的整个颜色都是起点色。

我们把起点圆的半径设为0,那径向渐变的“变心”,就真的是一个点了。

大部分时候我们都不需要很正规的径向渐变,反而希望他的变心是偏移的,类似下图:

这个时候,canvas径向渐变两个圆的优势就出来了,只要我们起点圆与终点圆的圆心不重合,那变心也就会偏移:

var radial = ctx.createRadialGradient(75,75,0,55,55,55);

但此时的渐变范围依然是终点圆的范围哈。

很多人天生就有一种搞破坏的心理,比如这里,终点圆的半径总比起点圆大,但如果把他们反过来会怎么样呢?

var radial = ctx.createRadialGradient(75,75,55,55,55,0);

经测试,这样不会报错,只是原来的从内到外的渐变反过来变成了从外到内的渐变了。这是个好用法。

还有个问题,如果我们把起点圆的圆心偏移了,并且起点圆的范围超出了终点圆的范围,

这时会发生什么?

啊!?这是什么情况?!

当起点圆和终点圆只有部分重叠的时候,就会出现这种情况。所以,如果你需要正常的径向渐变,请保证其中一个圆完全包住了另一个圆

后记:既然渐变可以赋给fillStyle,那么也可以赋给strokeStyle。效果你懂的。

唉,写文章写的好辛苦。国外空间图片加载慢,所以图片全部都是外链,靠

原文

转载于:https://www.cnblogs.com/lixlib/archive/2012/11/30/2796485.html

html5 Canvas画图4:填充和渐变相关推荐

  1. HTML5 canvas画图

    HTML5 canvas画图 HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript). 不过,<canvas> 元素本身并没有绘制能力(它仅仅 ...

  2. php绘图和canvas,html5 canvas画图实例用法汇总

    HTML5 canvas画图HTML5 标签用于绘制图像(通过脚本,通常是 JavaScript).不过, 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务.get ...

  3. html5 canvas 画图移动端出现锯齿毛边的解决方法

    html5 canvas 画图移动端出现锯齿毛边的解决方法 参考文章: (1)html5 canvas 画图移动端出现锯齿毛边的解决方法 (2)https://www.cnblogs.com/dear ...

  4. html5 在线白板,Html5 canvas画图白板踩坑

    最近接手了一个小型的H5,最主要的功能大概就是拍照上传和canvas画板了. 主要是记录一下自己菜到像傻子一样的技术. 1.canvas画板隔空打牛!画布越往上部分错位距离越小,越往下距离越大. 2. ...

  5. html5画图论文结束语,基于HTML5 Canvas画图软件的设计与实现.doc

    摘要:在最近十年里,HTML5在Web开发标准完成了巨大的飞跃,和以前的版本相比,HTML5不但用来表示Web的内容,而且还把Web带入一个更高的平台.HTML5为我们带来很多新的特性,其中一个最重要 ...

  6. html如何使图片不自动填充颜色,使用HTML5 Canvas为图片填充颜色和纹理的教程

    填充颜色 艺术离不开色彩,今天咱们来介绍一下填充颜色,体会一下色彩的魅力. 填充颜色主要分为两种: 1.基本颜色 2.渐变颜色(又分为线性渐变与径向渐变) 我们一个个来看. 填充基本颜色Canvas ...

  7. [转]html5 Canvas画图教程(1)—画图的基本常识

    今天看到一个讲Canvas的教程,很通俗移动,所以转载了下. 虽然大家都称Canvas为html5的新标签,看起来好像Canvas属于html语言的新知识,但其实Canvas画图是通过javascri ...

  8. html5 Canvas画图教程(5)—canvas里画曲线之arc方法

    本文转自:http://www.jb51.net/html5/70317.html 在canvas画线条这篇文章中,我讲了画直线的方法,按理这篇画曲线的文章早该发了,但由于canvas画曲线比较特殊, ...

  9. html5图片上写字,Html5 canvas画图教程20:在canvas里写字

    文章写到现在才发现我忘了介绍在canvas上写字的方法,呃,这篇补上. 其实在canvas里写字是很简单的,他有两个原生方法,即strokeText(描边文字)和fillText(填充文字)--一看就 ...

最新文章

  1. 电脑主板线路连接图解_电工速学手册:306页现场电工全能图解,实用技术精选大合集!...
  2. HTTP 和 HTTP API 设计
  3. NIO实例:Selector+SocketChannel实现多人聊天
  4. Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)
  5. 在C#中使用RESTful API的几种好方法
  6. 简述计算机模拟人类交流信息的过程,信息沟通
  7. Android QA
  8. vi是linux文本界面编辑器吗,LINUX初学之文本编辑器(vi ,vim)
  9. VMware虚拟机Bridged(桥接模式)
  10. oracle 表查询(1)
  11. redis数据类型之sorted set
  12. Win10鼠标宏怎么设置?电脑设置鼠标宏的方法
  13. macOS如何刷新DNS缓存
  14. 路由器无线中继/桥接(WDS)设置
  15. 笔记本计算机作文,介绍笔记本电脑的作文600字
  16. 基于嵌入式Linux的无线路由器设计——Bridged Adapter网桥模式
  17. python天气查询运行过程_菜鸟玩Python|制作天气查询软件
  18. matlab矩阵正交变换,在线计算专题(12):矩阵的特征值、特征向量、正交变换与二次型与常见矩阵分解...
  19. 关于浙政钉、专有钉钉的数据埋点小心得总结(稳定性监控、流量分析)
  20. 数据分析师的Windows装机必备软件

热门文章

  1. Linux 群组管理
  2. 中文转换成阿拉伯数字
  3. maven 一个模块生成多个jar包
  4. Php开发官方IDE ZEND
  5. 时尚经典 体验云桌办公经典时尚办公方式
  6. 阿里云 centos oracle安装
  7. Android Studio查找或设置函数注释的快捷键
  8. Android Dialog 全屏、Dialog 底部显示
  9. Android 图片放错位置会拉伸变形
  10. python断点调试不起作用flask_关于python的flask框架下的调试