在本文中主要是介绍下canvas中一些常用的、重要的函数的使用。
阴影
其实这4个方法类似于css3的box-shadow,接下来先对比着说明下:
box-shadow: h-shadow v-shadow blur spread color inset;
css3的box-shadow的h-shadow属性等同于shadowOffsetX函数,设置阴影在水平方向便宜的距离,可以为正负,正值表示在阴影右边偏移,负值表示阴影在左边偏移;
box-shadow的v-shadow和shadowOffsetY差不多,正值表示阴影在下方偏移,负值表示阴影在上方偏移;
box-shadow的blur和shadowBlur差不多,设置阴影的模糊层次,不能为负值,设置为0表示没有模糊的层次或级别,有点区别的是,css3的box-shadow的blur是带单位px的,canvas的shadowBlur不带单位可以是浮点数;
canvas的shadowColor和css3的color属性一样,设置阴影的颜色;
可以看到css3的阴影还多了两个属性可以设置,一个是spread-阴影的扩展半径其值可以是正负值,如果值为正,则整个阴影都延展扩大,反之值为负值时,则缩小;另一个是inset-阴影的投影方式,有两个值,inset,outset(默认值)。
下面来看一个canvas绘制阴影的列子,
var c=document.getElementById("canvas"); var ctx=c.getContext("2d"); ctx.shadowOffsetX = 2;//水平上向右偏移2px ctx.shadowOffsetY = 2;//垂直方向上向下偏移2px ctx.shadowBlur = 4;//模糊层次级别为4 ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; ctx.font = "24px Times New Roman"; ctx.fillStyle = "#0A9DC7"; ctx.fillText("shadow", 5, 30);
渐变
createLinearGradient(x0,y0,x1,y1):创建线性的渐变,线性变化的
参数是渐变开始点的横纵坐标、结束点的横纵坐标
var c=document.getElementById("canvas"); var ctx=c.getContext("2d"); var gradient=ctx.createLinearGradient(0,0,140,15); gradient.addColorStop(0,"#ff00ff"); gradient.addColorStop(0.3,"#eaeaea");//添加渐变段0-1.0之间 gradient.addColorStop(0.6,"#662233"); gradient.addColorStop(1,"#339944"); ctx.fillStyle=gradient; ctx.fillRect(20,20,150,100);
createLinearGradient(x0,y0,r0,x1,y1,r1):创建放射状/圆形渐变,径向变化的,可以想象成一个以一个半径开始圆形的向周围扩展,就想在平静的水中,丢下一个石头,波纹扩散一样
参数是渐变点开始点横纵坐标,开始渐变的半径,渐变结束的横纵坐标,渐变结束的半径
var c=document.getElementById("canvas"); var ctx=c.getContext("2d"); var radgrad = ctx.createRadialGradient(45,45,10,52,50,30); radgrad.addColorStop(0, '#A7D30C'); radgrad.addColorStop(0.9, '#019F62'); radgrad.addColorStop(1, 'rgba(1,159,98,0)'); ctx.fillStyle = radgrad; ctx.fillRect(0,0,150,150);
pattern
createPattern() 在指定的方向内重复指定的元素,元素可以是图片、视频,或者其他的canvas,可以用来充当画笔,填充一块画布区域
将一个图片创建为一个pattern
var c=document.getElementById("canvas"); var ctx=c.getContext("2d"); var img = new Image(); img.src = 'img/ft.png'; img.onload = function(){ var ptrn = ctx.createPattern(img,'repeat');//指定元素的重复方式,有repeat,repeat-x,repeat-y,no-repeat等方式 ctx.fillStyle = ptrn; ctx.fillRect(0,0,100,80); }
利用这个方法,我们可以方便的把其他的元素充当为画刷进行一些可控的循环绘制,类似于ps的中的画刷。
线条样式
lineCap 设置或返回线条末端线帽的样式
有butt|round|square三个值可选,默认为butt
butt :向线条的每个末端添加平直的边帽
round:向线条的每个末端添加圆形线帽
square :向线条的每个末端添加正方形线帽
var c=document.getElementById("canvas"); var ctx=c.getContext("2d"); ctx.lineWidth=10; ctx.strokeStyle="#009689"; ctx.beginPath(); ctx.moveTo(20,20); ctx.lineTo(200,20); ctx.lineCap="butt"; ctx.stroke(); ctx.beginPath(); ctx.moveTo(20,40); ctx.lineTo(200,40); ctx.lineCap="round"; ctx.stroke(); ctx.beginPath(); ctx.lineCap="square"; ctx.moveTo(20,60); ctx.lineTo(200,60); ctx.stroke(); ctx.lineWidth=1; ctx.strokeText("butt",210,22); ctx.strokeText("round",210,42); ctx.strokeText("square",210,62);
lineJoin 在两条线交汇时,设置或返回所创建边角的类型
有”bevel|round|miter 3个值,默认为miter
依次为round,bevel,miter 三种类型的表现形式
var c=document.getElementById("canvas"); var ctx=c.getContext("2d"); ctx.lineWidth=10; ctx.strokeStyle="#2EA879"; ctx.beginPath(); ctx.lineJoin="round"; ctx.moveTo(10,10); ctx.lineTo(40,20); ctx.lineTo(10,40); ctx.stroke(); ctx.beginPath(); ctx.lineJoin="bevel"; ctx.moveTo(60,10); ctx.lineTo(90,20); ctx.lineTo(10,90); ctx.stroke(); ctx.beginPath(); ctx.lineJoin="miter"; ctx.moveTo(110,10); ctx.lineTo(140,20); ctx.lineTo(10,140); ctx.stroke();路径相关