利用canvas绘制图形

时间:2023-02-10 23:00:57


    绘制图有很多种方法,可以借助flash实现,也可以使用SVG和VML来绘图。本章将要学习一种新的绘图方法——使用Canvas元素,它是基于HTML5原生的绘图功能。使用Canvas元素,可以绘制图形,也可以实现动画。它方便了使用Javascript脚本的前端开发人员,寥寥的竖行代码,就可以在Canvas元素中实现各种图形及动画。本章将介绍如何使用Canvas元素来绘制一些简单的图形。
本章主要知识点如下:
·认识Canvas元素
·使用Canvas绘图
·Canvas与JavaScript之间的互动
·利用Canvas实现网页中的动画

10.1 认识Canvas
    HTML5的Canvas元素有一套绘图API(即接口函数),自成体系。
    JavaScript就是通过调用这些绘图API来实现绘制图形和动画功能的。
10.1.01 Canvas的历史
    在HTML5以前的标准中,有一个缺陷,就是不能直接动态地在HTML页面中绘制图形。若要在页面中实现绘图,或者是非常复杂的页面实现(使用大量的Javascript代码),要么借助第三方工具实现(如Flash、SVG、VML等)。这种做法无疑是把问题复杂化了。

在互联网应用不断发展中,页面绘制使用的越来越多。
在未来的发展趋势上,也需要HTML自己完成绘图功能,
Canvas元素应运而生。
    Canvas元素是为了客户端矢量图形而设计的。
    它自己没有行为,但却把一个绘图API展现给客户端Javascript;使脚本能够把想绘制的东西都绘制到一块画布上。Canvas的概念最初有苹果公司提出,并在Safari1.3Web 浏览器中首次引入。随后Firefox 1.4 和 Opera9两款浏览器都开始支持Canvas绘图。目前IE9以上版本也已经支持这项功能。Canvas的标准化正由一个Web浏览器厂商的非正式协会在推进,目前Canvas已经成为HTML5草案中一个正式的标签。

10.1.02 Canvas与SVG,以及VML之间的差异
    Canvas有一个基于Javascript的绘图API,而SVG和VML使用一个XML文档来描述绘图。Canvas与SVG,以及VML的实现方式不同,但在实现上可以互相模拟。
    Canvas有自己的优势,由于不存储文档对象,性能较好。
    但若要移除画布里的图形元素,往往需要擦掉绘图从新绘制它。

10.2 Canvas基本知识
    在网页上使用Canvas元素,像使用其他HTML标签一样简单,然后利用JavaScript脚本调用绘图API,绘制各种图形。
Canvas拥有多种绘制路径、矩形、圆形、字符,以及添加图像的方法,还能够实现动画。
 
10.2.01 构建Canvas元素
    Canvas元素是以标签的形式应用到HTML页面上的。在HTML页面中放入:
    <canvas></canvas>
    不过Canvas毕竟是个新东西,很多旧浏览器都不支持。为了增加用户体验,可以提供替代文字,放在Canvas标签中。例如:
    <canvas>你的浏览器不支持该功能!</canvas>
    当浏览器不支持Canvas时,标签里的文字就会显示出来。跟其他HTML标签一样,Canvas标签有一些共同的属性:
    <canvas id="canvas" width="200" height="200">你的浏览器不支持Canvas标签功能</canvas>
    其中,id属性决定了Canvas标签的唯一性,方便查找。width和height属性分别决定了Canvas的宽和高,其数值代表了Canvas标签内包含了多少像素。
    Canvas标签可以和其他标签一样应用CSS样式表。如果在头部的样式表中添加如下样式:
    canvas{
        border:1px solid #CCC;
    }
    可以使用CSS样式来控制Canvas的宽和高,但Canvas内部的像素点还是根据Canvas自身的width和height属性确定,默认是宽300像素,高是150像素。用CSS设置Canvas尺寸;只能体现Canvas占用的页面空间,但是Canvas内部的绘图像素还是由width和height属性来决定的。这样会导致整个Canvas内部的图像变形。
    
10.2.02 使用JavaScript实现绘图的流程
    Canvas元素本身是没有绘图能力的。所有的绘制工作必须在Javascript中完成。前面讲过,Canvas元素提供一套绘图API。在开始绘图之前,先要获取Canvas元素的对象,再获取一个绘图上下文,接下来就可以使用绘图API中丰富的功能了。
    1.获取Canvas对象
    在绘图之前,首先需要从页面中获取Canvas对象,通常使用document对象的getElementById()方法获取。例如,以下代码就是获取id为“canvas”的Canvas对象。
    var canvas = document.getElementById("canvas");
    开发者还可以使用通过标签名称来获取对象的getElementByTagName()方法。
    2.创建二维的绘图上下文对象。
    Canvas对象包含了不同类型的绘图API,还需要使用getContext()方法来获取,接下来要使用的绘图上下文对象。
    var content=canvas.getContext("2d");
    getContext对象是内建的HTML5对象,拥有<F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12><F12>

10.3 使用Canvas绘图
10.3 使用Canvas绘图
    本节将学习使用绘图API.在接下来的小节中将逐个演绎Canvas的各种绘图功能。

10.3.1 绘制矩形
    矩形属于一种特殊而又普遍使用的一种图形。
    矩形的宽和高,确定了图形的样子。
    再给予一个绘制其实坐标,就可以确定其位置了。
    这样正个矩形就确定下来了。
    绘图API为绘制矩形提供了两个专用的方法:strokeRect()和fillRect(),可分别用于绘制矩形边框和填充矩形区域。
    通常在绘制之前,往往先设置样式,然后才能进行绘制。
    1.设置样式
    strokeStyle
    lineWidth
    fillStyle

    strokeRect()
    fillRect()
    
    2
    3
    4.特殊的矩形绘制方式
    除了本节介绍的两个与矩形有关的方法(绘制矩形边框和填充矩形区域)外,还有一个方法clearRect。执行该方法,将会擦除指定的矩形区域,使其变为透明。使用方法如下:
    context.clearRect(x,y,width,height);

10.3.2 使用路径
    路径就是预先构建好的图像轮廓。它由一个或多个直线段或曲线段组成,可以是开放的,也可以是闭合的。在很多绘图工具或方法中都会用到。
    canvas中,所有基本图形都是以路径为基础的,我们通常会调用lineTo(),rect(),arc()等方法来设置一些路径。在最后使用fill()或stroke()方法进行绘制边框或填充区域时,都是参照这个路径来进行的。
使用路径的进本方法由三步:
·创建绘图路径
·设置绘图样式
·绘制图形
1.创建绘图路径
    创建绘图路径经常会用到两个方法beginPath()和closePath(),分别表示开始一个新的路径和关闭当前的路径。
首先,使用beginPath()方法创建一个新的路径。该路径是一组子路径的形式存储的,他们共同构成一个图形。
每次调用beginPath()方法,都会产生一个新的子路径。
……

10.3.3 图形组合
    通常,把一个图形绘制在另个图形上,称之为图形组合。
    默认的情况是上面的图形覆盖了下面的图形,这也是图形组合默认的设置了“sourse-over”;

10.3.4 绘制曲线
    在实际的绘图中,绘制曲线是常用的一种绘图形式。我们在设置路径的时候,需要使用一些曲线方法来勾勒出曲线路径,以完成曲线的绘制。在Canvas中,绘图API提供了多种曲线绘制方法。主要的曲线绘制方法有arc(),arcTo(),quad

10.3.5 使用图像
    有时候,可能需要借助一些现有的图片,以便绘图更加灵活和方便。在Canvas中,绘图API已经提供了插入
10.3.06 剪切区域
10.3.07 绘制渐变
10.3.08 描边属性
10.3.09 模式
10.3.10 变换
10.3.11 使用文本
10.3.12 阴影效果
10.3.13 状态保存与恢复
10.3.14 操作像素