canvas绘图基本使用方法(二)

2021-05-28 13:56:21 浏览数 (1)

canvas绘图基本使用方法(二)

转载至博客http://blog.csdn.net/u014607184/article/details/51746384 诗渊

线条属性

除了上面用到的lineWidth属性,线条还有以下几个属性:

  • lineCap 属性设置或返回线条末端线帽的样式,可以取以下几个值: “butt” 向线条的每个末端添加平直的边缘(默认); “round” 向线条的每个末端添加圆形线帽; “square” 向线条的每个末端添加正方形线帽。
  • lineJoin 属性当两条线交汇时设置或返回所创建边角的类型,可以取以下几个值: “miter” 创建尖角(默认); “bevel” 创建斜角; “round” 创建圆角。
  • miterLimit 属性设置或返回最大斜接长度(默认为10)。斜接长度指的是在两条线交汇处内角和外角之间的距离。只有当 lineJoin 属性为 “miter” 时,miterLimit 才有效。

var canvas =

document.getElementById("canvas"); var context = canvas.getContext("2d"); //测试lineCap属性 //设置基准线便于观察 context.moveTo(10,10); context.lineTo(10,200); context.moveTo(200,10); context.lineTo(200,200); context.lineWidth="1"; context.stroke(); //butt context.beginPath(); context.moveTo(10,50); context.lineTo(200,50); context.lineCap="butt"; context.lineWidth="10"; context.stroke(); //round context.beginPath(); context.moveTo(10,100); context.lineTo(200,100); context.lineCap="round"; context.lineWidth="10"; context.stroke(); //square context.beginPath(); context.moveTo(10,150); context.lineTo(200,150); context.lineCap="square"; context.lineWidth="10"; context.stroke(); //测试linJoin属性 //miter context.beginPath(); context.moveTo(300,50); context.lineTo(450,100); context.lineTo(300,150); context.lineJoin="miter"; context.lineWidth="10"; context.stroke(); //round context.beginPath(); context.moveTo(400,50); context.lineTo(550,100); context.lineTo(400,150); context.lineJoin="round"; context.lineWidth="10"; context.stroke(); //square context.beginPath(); context.moveTo(500,50); context.lineTo(650,100); context.lineTo(500,150); context.lineJoin="bevel"; context.lineWidth="10"; context.stroke(); //测试miterLimit属性 context.beginPath(); context.moveTo(700,50); context.lineTo(850,100); context.lineTo(700,150); context.lineJoin="miter"; context.miterLimit="2"; context.lineWidth="10"; context.strokeStyle="#2913EC"; context.stroke();

各属性的不同取值的效果如下:

填充样式

前面用到的fillStyle和strokeStyle除了设置颜色外,还能设置其他填充样式,这里以fillStyle为例:

  • 线性渐变 使用步骤 (1)var grd = context.createLinearGradient( xstart , ystart, xend , yend )创建一个线性渐变,设置起始坐标和终点坐标; (2)grd.addColorStop( stop , color )为线性渐变添加颜色,stop为0~1的值; (3)context.fillStyle=grd将赋值给context。
  • 径向渐变 该方法与线性渐变使用方法类似,只是第一步接收的参数不一样 var grd = context.createRadialGradient(x0 , y0, r0 , x1 , y1 , r1 );接收起始圆心的坐标和圆半径以及终点圆心的坐标和圆的半径。
  • 位图填充 createPattern( img , repeat-style )使用图片填充,repeat-style可以取repeat、repeat-x、repeat-y、no-repeat。

效果如下:

图形变换

平移:context.translate(x,y),接收参数分别为原点在x轴方向平移x,在y轴方向平移y。

缩放:context.scale(x,y),接收参数分别为x坐标轴按x比例缩放,y坐标轴按y比例缩放。

旋转:context.rotate(angle),接收参数是坐标轴旋转的角度。

需要说明的是,对图形进行变化后,接下来的一次绘图是紧接着上一次的状态的,所以如果需要回到初始状态,要用到context.save();context.restore();来保存和恢复当前状态:

效果如下:

另外一个跟图形变换相关的是:矩阵变换 :context.transform(a, b, c, d, e, f, g)。参数的含义如下: a 水平缩放 ( 默认为1 ) b 水平倾斜 ( 默认为 0 ) c 垂直倾斜 ( 默认为 0 ) d 垂直缩放 ( 默认为1 ) e 水平位移 ( 默认为 0 ) f 垂直位移 ( 默认为 0 ) 读者可以自行验证其各个参数的效果,这里就不一一介绍了。

绘制曲线

跟绘制曲线的有四个函数,分别是:

  • context.arc(x,y,r,sAngle,eAngle,counterclockwise);用于创建弧/曲线(用于创建圆或部分圆)。接收的参数含义: | 参数 | 含义 | | :————- |:————-| | x | 圆的中心的 x 坐标 | |y|圆的中心的 y 坐标| |r|圆的半径| |sAngle|起始角,以弧度计(弧的圆形的三点钟位置是 0 度)| |eAngle|结束角,以弧度计| |counterclockwise|可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针| 下面是几个arc()函数的几个示例:

var canvas =

document.getElementById("canvas"); var context =

canvas.getContext("2d"); context.strokeStyle = "#F22D0D"; context.lineWidth = "2"; //绘制圆 context.beginPath(); context.arc(100,100,40,0,2*Math.PI); context.stroke(); //绘制半圆 context.beginPath(); context.arc(200,100,40,0,Math.PI); context.stroke(); //绘制半圆,逆时针 context.beginPath(); context.arc(300,100,40,0,Math.PI,true); context.stroke(); //绘制封闭半圆 context.beginPath(); context.arc(400,100,40,0,Math.PI); context.closePath(); context.stroke();

效果如下:

  • context.arcTo(x1,y1,x2,y2,r); 在画布上创建介于两个切线之间的弧/曲线。接收的参数含义:

参数

含义

x1

弧的控制点的 x 坐标

y1

弧的控制点的 y 坐标

x2

弧的终点的 x 坐标

y2

弧的终点的 y 坐标

r

弧的半径

这里需要注意的是arcTo函数绘制的曲线的起始点需要通过moveTo()函数来设置,下面利用arcTo函数绘制一个圆角矩形:

效果如下:

  • context.quadraticCurveTo(cpx,cpy,x,y);绘制二次贝塞曲线,参数含义如下: 参数含义cpx贝塞尔控制点的 x 坐标cpy贝塞尔控制点的 y 坐标x结束点的 x 坐标y结束点的 y 坐标曲线的开始点是当前路径中最后一个点。如果路径不存在,那么请使用 beginPath() 和 moveTo() 方法来定义开始点。
  • context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y); 绘制三次贝塞尔曲线,参数如下: 参数含义cp1x第一个贝塞尔控制点的 x 坐标cp1y第一个贝塞尔控制点的 y 坐标cp2x第二个贝塞尔控制点的 x 坐标cp2y第二个贝塞尔控制点的 y 坐标x结束点的 x 坐标y结束点的 y 坐标

sdzfgdhg

0 人点赞