填充样式主要针对fillStyle。fillStyle除了可以赋值为color,还可以赋值渐变色,包括线性渐变色和径向渐变色,还是和css3里的内容类似。

一、线性渐变

1、设置线性渐变的填充样式

设置线性渐变的填充样式需要2步骤

1、设置渐变线段

通过2个坐标确定渐变线段,来定义渐变的方向和尺度。

var linearGradient=context.createLinearGradient(xstart,ystart,xend,yend);

2、添加关键色

stop来决定关键色的位置,从0.0到1.0的浮点数表示

color来决定关键色的颜色

linearGradient.addColorStop(stop,color);

然后linearGradient变量就可以作为fillStyle的值。

window.onload=function(){
var canvas=document.getElementById("canvas"); canvas.width=400;
canvas.height=400; var context=canvas.getContext("2d");
//从左上角到右下角
var linearGradient=context.createLinearGradient(0,0,400,400);
linearGradient.addColorStop(0.0,"#fff");//由白
linearGradient.addColorStop(1.0,'#000');//变黑
context.fillStyle=linearGradient;//然后就可以赋给fillStyle了 context.fillRect(0,0,400,400);
}

2、注意点

可以添加无数个addColorStop

window.onload=function(){
var canvas=document.getElementById("canvas"); canvas.width=400;
canvas.height=400; var context=canvas.getContext("2d");
//从左上角到右下角
var linearGradient=context.createLinearGradient(0,0,400,400);
linearGradient.addColorStop(0.0,"red");//由红
linearGradient.addColorStop(0.166,'orange');//变橙
linearGradient.addColorStop(0.332,'yellow');//变黄
linearGradient.addColorStop(0.498,'green');//变绿
linearGradient.addColorStop(0.664,'cyan');//变青
linearGradient.addColorStop(0.83,'blue');//变蓝
linearGradient.addColorStop(1,'purple');//变紫
context.fillStyle=linearGradient;//然后就可以赋给fillStyle了 context.fillRect(0,0,400,400);
}

红橙黄绿青蓝紫七个colorStop

除了倾斜渐变,还可以是水平渐变和垂直渐变。只需要修改渐变线段的起始坐标。

var linearGradient=context.createLinearGradient(0,0,400,0); //水平
var linearGradient=context.createLinearGradient(0,0,0,400);//垂直

渐变线段可以不跨越整个canvas画布,比如

var linearGradient=context.createLinearGradient(0,0,200,200);

线性渐变到(200,200)结束,结束的其它部分显示的是结束时的颜色。

渐变线段可以超过画布的大小, 定义在画布外面的关键色将不会显示。

var linearGradient=context.createLinearGradient(-200,-200,400,400); //超过画布

绘制的填充的形状也不一定占满整个画布。填充形状会在填充线段上找到合适的填充色。

var linearGradient=context.createLinearGradient(-200,-200,400,400); //超过画布 

3,将线性渐变应用到星空

原来是黑色星空变成渐变色天空。
//context.fillStyle="black"; //原来是黑色星空
var linearGradient=context.createLinearGradient(0,0,0,canvas.height); //垂直渐变
linearGradient.addColorStop(0.0,'black');//从黑色
linearGradient.addColorStop(1.0,'#035');//到深蓝色
context.fillStyle=linearGradient;//赋值给fillStyle

再做点小修改,把画布改成长方形,把星星分布在上空制造出天和地的效果。

window.onload=function(){
var canvas=document.getElementById("canvas"); canvas.width=1200; //改成长方形
canvas.height=800; var context=canvas.getContext("2d"); //context.fillStyle="black"; //原来是黑色星空
var linearGradient=context.createLinearGradient(0,0,0,canvas.height); //垂直渐变
linearGradient.addColorStop(0.0,'black');//从黑色
linearGradient.addColorStop(1.0,'#035');//到深蓝色
context.fillStyle=linearGradient;//赋值给fillStyle
context.fillRect(0,0,canvas.width,canvas.height); for(var i=0;i<200;i++){
var r=Math.random()*5+5; //星星变小点
var x=Math.random()*canvas.width;
var y=Math.random()*canvas.height*0.65; //产生天和地的效果,y坐标从0到canvas高的65%的区间
var a=Math.random()*360;
drawStar(context,x,y,r,a);
} } //rot顺时针旋转的角度
function drawStar(ctx,x,y,R,rot){ ctx.save(); ctx.translate(x,y);
ctx.rotate(rot/180*Math.PI);
ctx.scale(R,R); starPath(ctx);
//绘制在(x,y)大小为R,旋转rot度的五角星 ctx.fillStyle="#fb3";
//放弃外边框的绘制
// ctx.strokeStyle="#fd5";
// ctx.lineWidth=3;
// ctx.lineJoin="round"; ctx.fill();
// ctx.stroke(); ctx.restore();
} function starPath(ctx){
ctx.beginPath();
//角度转弧度:除以180*PI
for(var i=0;i<5;i++){
ctx.lineTo(Math.cos((18+i*72)/180*Math.PI),
-Math.sin((18+i*72)/180*Math.PI));
ctx.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5,
-Math.sin((54+i*72)/180*Math.PI)*0.5);
}
ctx.closePath();
}

渐变色可以用在icon里等,展示更立体的效果,更逼真,关键是确定好colorStop。

二、径向渐变

radial Gradient定义在两个同心圆之间的放射状渐变。

1、设置线性渐变的填充样式

同样使用2步创建:

1、确定好2个圆环

var radialGradient=context.createRadialGradient(x0,y0,r0,x1,y1,r1);

2、添加colorStop

radialGradient=context.addColorStop(stop,color);

然后linearGradient变量就可以作为fillStyle的值。

把上面的彩虹线性渐变改一下:

window.onload=function(){
var canvas=document.getElementById("canvas"); canvas.width=400;
canvas.height=400; var context=canvas.getContext("2d");
//从左上角到右下角
var radialGradient=context.createRadialGradient(200,200,0,200,200,200);
radialGradient.addColorStop(0.0,"red");//由红
radialGradient.addColorStop(0.166,'orange');//变橙
radialGradient.addColorStop(0.332,'yellow');//变黄
radialGradient.addColorStop(0.498,'green');//变绿
radialGradient.addColorStop(0.664,'cyan');//变青
radialGradient.addColorStop(0.83,'blue');//变蓝
radialGradient.addColorStop(1,'purple');//变紫
context.fillStyle=radialGradient;//然后就可以赋给fillStyle了 context.fillRect(0,0,400,400);
}

把内圆的半径增大,

var radialGradient=context.createRadialGradient(200,200,100,200,200,200);//圆环

里面圆填充为径向渐变开始的颜色,外面圆外填充的是径向渐变结束的颜色。

2,将径向渐变应用到星空

由下边框中心点开始的径向渐变。

    //原来是线性渐变星空
var radialGradient=context.createRadialGradient(
canvas.width/2,canvas.height,0,
canvas.width/2,canvas.height,canvas.height); //径向渐变
radialGradient.addColorStop(0.0,'#035');//从深蓝色
radialGradient.addColorStop(1.0,'black');//到黑色
context.fillStyle=radialGradient;//赋值给fillStyle
context.fillRect(0,0,canvas.width,canvas.height);
window.onload=function(){
var canvas=document.getElementById("canvas"); canvas.width=1200; //改成长方形
canvas.height=800; var context=canvas.getContext("2d"); //原来是线性渐变星空
var radialGradient=context.createRadialGradient(
canvas.width/2,canvas.height,0,
canvas.width/2,canvas.height,canvas.height); //径向渐变
radialGradient.addColorStop(0.0,'#035');//从深蓝色
radialGradient.addColorStop(1.0,'black');//到黑色
context.fillStyle=radialGradient;//赋值给fillStyle
context.fillRect(0,0,canvas.width,canvas.height); for(var i=0;i<200;i++){
var r=Math.random()*5+5; //星星变小点
var x=Math.random()*canvas.width;
var y=Math.random()*canvas.height*0.65; //产生天和地的效果,y坐标从0到canvas高的65%的区间
var a=Math.random()*360;
drawStar(context,x,y,r,a);
} } //rot顺时针旋转的角度
function drawStar(ctx,x,y,R,rot){ ctx.save(); ctx.translate(x,y);
ctx.rotate(rot/180*Math.PI);
ctx.scale(R,R); starPath(ctx);
//绘制在(x,y)大小为R,旋转rot度的五角星 ctx.fillStyle="#fb3";
//放弃外边框的绘制
// ctx.strokeStyle="#fd5";
// ctx.lineWidth=3;
// ctx.lineJoin="round"; ctx.fill();
// ctx.stroke(); ctx.restore();
} function starPath(ctx){
ctx.beginPath();
//角度转弧度:除以180*PI
for(var i=0;i<5;i++){
ctx.lineTo(Math.cos((18+i*72)/180*Math.PI),
-Math.sin((18+i*72)/180*Math.PI));
ctx.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5,
-Math.sin((54+i*72)/180*Math.PI)*0.5);
}
ctx.closePath();
}

三、使用图片、画布或者video

1、使用图片创建样式

createPattern(img,repeat-style);描述图片以什么样的方式重复。

repeat-style:no-repeat / repeat-x / repeat-y / repeat

使用图片通常为表现一种纹理或背景。

下面分别是用下图进行填充no-repeat/repeat-x/repeat-y/repeat的效果。

window.onload=function(){
var canvas=document.getElementById("canvas"); canvas.width=400;
canvas.height=400; var context=canvas.getContext("2d"); var backgroundImage=new Image();
backgroundImage.src='./images/grain.jpg';
backgroundImage.onload=function(){
var pattern=context.createPattern(backgroundImage, "no-repeat");
context.fillStyle=pattern;
context.fillRect(0,0,400,400); }
}

2、使用画布创建填充样式

createPattern(canvas,repeat-style);

让我们可以自己绘制想要的背景图案。

动态创建100*100的画布,并且在上面绘制五角星。然后把该画布作为参数传递给createPattern()。

window.onload=function(){
var canvas=document.getElementById("canvas"); canvas.width=400;
canvas.height=400; var context=canvas.getContext("2d"); var bgCanvas=createBackgroundCanvas();
var pattern=context.createPattern(bgCanvas,"repeat");
context.fillStyle=pattern;
context.fillRect(0,0,400,400);
} //动态创建100*100的画布,并且在上面绘制五角星
function createBackgroundCanvas(){
var bgCanvas=document.createElement("canvas");
bgCanvas.width=100;
bgCanvas.height=100;
var bgCanvasContext=bgCanvas.getContext("2d");
drawStar(bgCanvasContext,50,50,50,0);
return bgCanvas;
} //rot顺时针旋转的角度
function drawStar(ctx,x,y,R,rot){ ctx.save(); ctx.translate(x,y);
ctx.rotate(rot/180*Math.PI);
ctx.scale(R,R); starPath(ctx);
//绘制在(x,y)大小为R,旋转rot度的五角星 ctx.fillStyle="#fb3";
//放弃外边框的绘制
// ctx.strokeStyle="#fd5";
// ctx.lineWidth=3;
// ctx.lineJoin="round"; ctx.fill();
// ctx.stroke(); ctx.restore();
} function starPath(ctx){
ctx.beginPath();
//角度转弧度:除以180*PI
for(var i=0;i<5;i++){
ctx.lineTo(Math.cos((18+i*72)/180*Math.PI),
-Math.sin((18+i*72)/180*Math.PI));
ctx.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5,
-Math.sin((54+i*72)/180*Math.PI)*0.5);
}
ctx.closePath();
}

3、使用video创建填充样式

createPattern(video,repeat-style);

四、总结

fillStyle可以赋值以下类型

fillStyle=color / gradient / image / canvas / video

其中为color时:

color= #ffffff / #642 / rgb(255,128,0) / rgba(100,100,100,0.8) / hsl(20,62%,28%) / red

为渐变时

var linearGradient=context.createLinearGradient(xstart,ystart,xend,yend);

var radialGradient=context.createRadialGradient(x0,y0,r0,x1,y1,r1);

然后addColorStop(stop,color)

为其它时,使用createPattern

createPattern(img, repeat-style)

createPattern(canvas,repeat-style)

createPattern(video,repeat-style)

其中repeat可以取值no-repeat / repeat-x / repeat-y / repeat

最后fillStyle的这些取值同样适用于strokeStyle。

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/8660470.html  有问题欢迎与我讨论,共同进步。

canvas填充样式的更多相关文章

  1. HTML5 Canvas ( 图片填充样式 ) fillStyle, createPattern

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. HTML5 Canvas 填充与描边(Fill And Stroke)

    HTML5 Canvas 填充与描边(Fill And Stroke) 演示HTML5 Canvas Fill 与Stroke文字效果,基于Canvas如何实 现纹理填充与描边. 一:颜色填充与描边 ...

  3. HTML5 Canvas ( 填充图形的绘制 ) closePath, fillStyle, fill

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. canvas填充规则

    canvas填充规则 const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); ct ...

  5. html5 canvas 填充渐变形状

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. (三)canvas绘制样式

    beginPath() 对画线点的一个开始限制 moveTo() 画线的起点,只在开头使用 参数两个x轴,y轴 lineTo() 后续连线 两个参数x轴,y轴 stroke() 连线无填充 fill( ...

  7. 超酷!!HTML5 Canvas 水流样式 Loading 动画

    今天我们要分享另外一款基于HTML5 Canvas的液体流动样式Loading加载动画,这款Loading动画在加载时会呈现液体流动的动画效果,并且由于和背景颜色的对比,也略微呈现发光的动画效果. 效 ...

  8. H5 canvas填充文字自动换行

    canvas是H5中非常重要,非常常用,也是非常强大的一个新标签,美中不足的事,canvas中没没有自动换行的属性,我的第一反应是,字符串截取,然后计算每行的距离来实现自动换行.. 然后百度了一下,已 ...

  9. canvas填充规则,非零环绕

    1.看一块区域是否填充 2.从这个区域拉一条直线 3,看和这条直线相交的轨迹 4.如果顺时针轨迹+1 5.如果逆时针轨迹-1 6.所有轨迹的值计算出来 7.如果是非0,那么填充 8.如果是0那么不填充

随机推荐

  1. freemarker自定义标签报错(四)

    freemarker自定义标签 1.错误描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严 ...

  2. Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index

    1.错误描述 WARN:2015-05-01 16:45:37[main] - Exception encountered during context initialization - cancel ...

  3. Linux显示指定区块大小为1048576字节

    Linux显示指定区块大小为1048576字节 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -m 文件系统 1M-blocks 已用 可用 已用% 挂 ...

  4. TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array. at mx.charts.series::LineSeries/ ...

  5. Django学习-15-Cookie

    Cookie             1.如果没有cookie,那么所有的网站都不能登录             2.客户端浏览器上的文件,keyvalues形式存储的,类似字典           ...

  6. iOS - MySQL 的安装配置

    前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: mysql-5.7.17-macos10.12-x86_64.dm ...

  7. JavaScript小括号、中括号、大括号的多义性

    语义1,函数声明时参数表 func(arg1,arg2){ // ... } 语义2,和一些语句联合使用以达到某些限定作用 // 和for in一起使用 for(var a in obj){ // . ...

  8. 4-20mA 意义

    工业上最广泛采用的标准模拟量电信号是用4~20mA直流电流来传输模拟量. 采用电流信号的原因是不容易受干扰.并且电流源内阻无穷大,导线电阻串联在回路中不影响精度,在普通双绞线上可以传输数百米.上限取2 ...

  9. C++堆栈详解

    一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. ...

  10. ubuntu 14.04 下实现浏览器接收UDP视频流

    前言 由于近期项目需求,需实现在浏览器上实时预览接收UDP视频流信息.此功能若在VLC上可轻松播放,奈何由于Chrome.Firefox版本的升级,渐渐浏览器不支持外部插件,因而使用VLC web插件 ...