canvas

来源:互联网 发布:传奇3装备数据库 编辑:程序博客网 时间:2024/06/14 18:14

在绘制含有大量元素的图表的时候,SVG 往往因为性能问题而无法胜任。英文中 Canvas 的意思是“画布”,不过这里说的 Canvas 是 HTML5 中新出的一个元素。开发者可以在上面绘制一系列图形。Canvas 在 HTML 文件中的写法:

<canvas id="canvas" width="宽度" height="高度"></canvas>
Canvas 绝大部分的绘图方法都与<canvsa> 标签无关,需要使用 JavaScript 对其进行操作,这就是所谓的 Canvas API
首先获取到这个元素:
var canvas = document.getElementById('canvas');
然后通过一个方法来获取可以调用一切 Canvas API 的入口:
var ctx = canvas.getContext('2d');

Canvas 中的基本概念

坐标

与数学上常见的笛卡尔坐标系不太相同,Canvas 的坐标系是计算机中常见的坐标系,它长这样:
这里写图片描述
画布的最左上角是 (0,0),往右 x 增大,往下 y 增大,而且 x 和 y 都是整数(就算在计算过程中不是整数,在绘制的时候也会当作整数处理),单位是像素。

绘图

Canvas 中,你需要控制一只画笔的移动和绘制。 Canvas 中你可以直接利用一些函数来画图,不用去控制那只画笔的位置。

Canvas 中的基本图形

通过上文定义的 ctx 变量可以干许多有意思的事情,我们先看看如何绘制一些基本图形。

线条

我们指定画笔移动到某一点,然后告诉画笔需要从当前这一点画到另一点。我们可以让画笔多次移动、绘制,最后统一输出到屏幕上。例子如下:

ctx.moveTo(10, 10);ctx.lineTo(150, 50);ctx.lineTo(10, 50);ctx.moveTo(10, 20);ctx.lineTo(40, 70);ctx.stroke();

上面的代码中,lineTo 是产生线条用的函数,执行完之后画笔就移到了线条的终点。需要注意的是,线条此时并没有显示在屏幕上,必须调用 stroke 才会显示。这样设计是有道理的,因为向屏幕上输出内容需要耗费大量的资源,我们完全可以先攒够一波 lineTo,最后用 stroke 放一个大的。

路径

绘制路径非常简单,只需要先告诉 ctx 一声“我要开始画路径了”,然后通过各种方法(例如 lineTo)绘制路径。如果需要画一个封闭路径,那就最后告诉 ctx一声:“我画完了,你把它封闭起来吧。”当然,不要忘记利用 stroke 输出到屏幕上。
一个简单的例子:

ctx.beginPath();ctx.moveTo(10, 10);ctx.lineTo(150, 50);ctx.lineTo(10, 50);ctx.closePath();ctx.stroke();

如果我不想只描绘路径线条,而是想填充整个路径呢?可以将最后一行的 stroke 改成 fill,这样就跟使用了画图中的油漆桶一样,封闭路径里面的内容就都被填充上颜色了:
ctx.fill();

弧 / 圆形

绘制弧的函数参数比较多:

ctx.arc(圆心 x 坐标, 圆心 y 坐标, 半径, 起始角度, 终止角度, 是否为逆时针);

注意,在 Canvas 的坐标系中,角的一边是以圆心为中心的水平向右的直线。角度单位均为弧度。方向为逆时针,于是就有了这么一个弧。如果方向为顺时针,那么就会是一个跟它互补的、非常非常大的弧……
这里写图片描述
所以如果转了 2π 圈之后,弧就成了圆形,因此也可以使用绘制弧的方式来绘制圆形:

矩形

// 只描边ctx.strokeRect(左上角 x 坐标, 左上角 y 坐标, 宽度, 高度);// 只填充ctx.fillRect(左上角 x 坐标, 左上角 y 坐标, 宽度, 高度);

线条样式 / 填充样式

之前绘制的所有图形都是黑色的,但是 Canvas 肯定不止这么一种颜色。事实上,Canvas 可以单独设置线条样式和填充样式,分别使用的是 strokeStyle 和 fillStyle。可能的值有三种:纯色、渐变、图像。既然线条样式与填充样式的使用方法相同,那么下面统一以填充样式为例。如果想设置线条样式,直接将所有的 fillStyle 改成 strokeStyle 即可,里面的参数都不变。

/* 纯色填充 */// 普通的颜色ctx.fillStyle = '#0000ff';// 带有透明度的颜色ctx.fillStyle = 'rgba(64, 0, 127, 0.5)';/* 渐变填充 */// 设置渐变的尺寸(参数分别为起始点的 x 和 y、终止点的 x 和 y)var gradient = ctx.createLinearGradient(0, 0, 170, 0);// 设置过渡色,第一个参数是渐变的位置,第二个参数是颜色gradient.addColorStop(0, 'magenta');gradient.addColorStop(0.5, 'blue');gradient.addColorStop(1.0, 'red');// 设置填充样式ctx.fillStyle = gradient;/* 图片填充 */// 创建图片var image = new Image;image.src = '/path/to/image.png';// 创建图片笔触,可以指定图片的平铺方式,这里是横向平铺var pattern = ctx.createPattern(image, 'repeat-x');// 设置笔触填充ctx.fillStyle = pattern;

关于渐变,除了代码中提到的线性渐变以外,还有reateRadialGradient,也就是径向渐变。

设置完填充样式之后,就可以使用 fill 来填充啦!如果设置的是线条样式,那么就可以使用 stroke 来描边。

当然,对于线条样式,还有个额外的方法叫 lineWidth 可以用来控制线条的宽度。

文字

要想在画布上画文字,首先需要知道所使用的字体和字号:

ctx.font = '30px Verdana';

然后就可以通过 strokeText 或者 fillText 来对字体描边或者填充字体。

ctx.strokeText("Hello Coding!", 23, 33);ctx.fillText("Hello Coding!", 23, 66);
0 0
原创粉丝点击