原:http://blog.chinaunix.net/uid-26672038-id-3757295.html
canvas 其实对于HTML来说很简单,只是一个标签元素而已,自己并没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上,拥有绘制路径,矩形,圆,字符以及图像等功能。 所有的标签只是图形的容器,必须使用JavaScript的 API 操作绘图。
使用接口获取并渲染为 2d 对象:
var canvas = document.getElementById("canvas"); var cantxt = canvas.getContext("2d");
首先是获取到 canvas 对象,从 canvas 对象中得到二维对象进行处理。
描绘路径的方法:
moveTo(x , y) : 显示的指定路径的起点为 x , y,左上角为原点,横向为 X 轴,纵向为 Y 轴。canvas 默认起点为 0 , 0。
lineTo(x , y) : 描绘一条从起点到 (x , y) 点的直线,并且将起始位置设为 (x , y)。
rect(left , top , width , height) : 描绘一个已知左上角端点位置,以及高和宽的矩形。描绘完成后起点会一定到左上角位子。
arcTo( x1 , y1 , x2 , y2 , radius ) : 用于描绘一个与两条线段相切的圆弧,两条线段分别以当前Context绘制起点和(x2, y2)点为起点,都以(x1, y1)点为终点,圆弧的半径为radius。描绘完成后绘制起点会移动到以(x2, y2)为起点的线段与圆弧的切点。
arc( x , y , radius , startAngle , endAngle , anticlockwise ) : 用于描绘一个以(x, y)点为圆心,radius为半径,startAngle为起始弧度,endAngle为终止弧度的圆弧。anticlockwise为布尔型的参数,true表示逆时针,false表示顺时针。参数中的两个弧度以0表示0°,位置在3点钟方向;Math.PI值表示180°,位置在9点钟方向。
quadraticCurveTo( cpx , cpy , x , y) : 以当前Context绘制起点为起点,(cpx,cpy)点为控制点,(x, y)点为终点的二次样条曲线路径。
bezierCurveTo( cpx1 , cpy1 , cpx2 , cpy2 , x , y); : 以当前Context绘制起点为起点,(cpx1,cpy1)点和(cpx2, cpy2)点为两个控制点,(x, y)点为终点的贝塞尔曲线路径。
描绘完成后,需要用下面方法描绘路径或者填充颜色:
stroke() : 按照路线绘线条。
例子:
cantxt.rect(50,50,40,80); cantxt.fillStyle = "#0F0"; cantxt.fill(); cantxt .moveTo(50,50); // 移动到坐标 50 50 cantxt.lineTo(150,150); // 划出轨迹到 150 150 cantxt.stroke(); // 以线条显示轨迹 // 突然会发现,颜色方面有点错误,线条的黑色会影响到矩形的绿色。所以需要使用 打开路径 关闭路径的方法隔断路径间的联系。 cantxt.beginPath(); cantxt.rect(50,50,50,100); cantxt.fillStyle = "#0F0"; cantxt.fill(); cantxt.closePath(); cantxt.beginPath(); cantxt .moveTo(50,50); // 移动到坐标 50 50 cantxt.lineTo(150,150); // 划出轨迹到 150 150 cantxt.stroke(); // 以线条显示轨迹 cantxt.closePath(); cantxt.beginPath(); cantxt.moveTo(50,50); cantxt.arcTo(100,100,200,50,50); cantxt.stroke(); cantxt.closePath();
其他的几个方法:
fillText(text , left , top , [maxWidth]) : 字符串,相对与原点的坐标,字符串的最大长度。其中最大长度maxWidth是可选参数。
例子:
cantxt.fillText("abcde",100,300);
不使用路径,直接填充颜色:
fillRect( left , top , width , height ) : 直接填充矩形。
cantxt.strokeRect( 50,50,100,100 ); cantxt.clearRect( 50,50,100,100 ); // 发现还会留下一圈边框 cantxt.clearRect( 49,49,102,102 );
fillRect没有上面的问题。
还有一些可以设置的属性:
strokeStyle : 线条颜色,默认为 "#000000",可设为 css颜色值,渐变对象,或者模式对象。
cantxt.translate(200,200); cantxt.rotate(1); cantxt.moveTo(0,0); cantxt.lineTo(100,100); cantxt.stroke();
Context对象中拥有drawImage()方法可以将外部图片绘制到Canvas中。