HTML5高级程序设计 (2).pdf
《HTML5高级程序设计 (2).pdf》由会员分享,可在线阅读,更多相关《HTML5高级程序设计 (2).pdf(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、22 第 2 章 Canvas API 2 Canvas API 本章中,我们将探索如何使用 HTML5 的 Canvas API。Canvas API 很酷,可以通过它来动态生成和展示图形、图表、图像以及动画。本章将使用渲染 API(rendering API)的基本功能来创建一幅可以放大缩小并自适应浏览器环境的图。还会演示如何基于用户输入来动态创建图像,生成热点图。当然,我们也会提醒你在使用 HTML5 Canvas 时需要注意的问题,并且分享解决这些问题的方法。本章只涉及了最基本的图形知识,因此,你大可不必担心学不会而跳过本章。来吧,让我们一起来感受 HTML5 中这个强大的特性吧。2.
2、1 HTML5 Canvas 概述 关于 HTML5 Canvas API 完全可以写一本书(还不会是一本很薄的书)。由于只有一章的篇幅,所以我们将讨论 API 中那些我们认为是最常用的功能。2.1.1 历史 Canvas 的概念最初是由苹果公司提出的,用于在 Mac OS X WebKit 中创建控制板部件(dashboard widget)。在 Canvas 出现之前,开发人员若要在浏览器中使用绘图 API,只能使用 Adobe的 Flash 和 SVG(Scalable Vector Graphics,可伸缩矢量图形)插件,或者只有 IE 才支持的 VML(Vector Markup L
3、anguage,矢量标记语言),以及其他一些稀奇古怪的 JavaScript 技巧。假设我们要在没有canvas元素的条件下绘制一条对角线听起来似乎很简单,但实际上如果没有一套二维绘图 API 的话,这会是一项相当复杂的工作。HTML5 Canvas 能够提供这样的功能,对浏览器端来说此功能非常有用,因此 Canvas 被纳入了 HTML5 规范。起初,苹果公司曾暗示可能会为 WHATWG(Web Hypertext Application Technology Working Group,Web 超文本应用技术工作组)草案中的 Canvas 规范申请知识产权,这在当时引起了一些在 第 2 章
4、 2.1 HTML5 Canvas 概述 23 1 2 3 4 6 9 11 7 5 8 10 Web 标准化追随者的关注。不过,苹果公司最终还是按照 W3C 的免版税专利权许可条款公开了其专利。SVG 和 CANVAS 对比“Canvas 本质上是一个位图画布,其上绘制的图形是不可缩放的,不能像 SVG 图像那样可以被放大缩小。此外,用 Canvas 绘制出来的对象不属于页面 DOM 结构或者任何命名空间这点被认为是一个缺陷。SVG 图像却可以在不同的分辨率下流畅地缩放,并且支持点击检测(能检测到鼠标点击了图像上的哪个点)。既然如此,为什么 WHATWG 的 HTML5 规范不使用 SVG
5、呢?尽管 Canvas 有明显的不足,但 HTML Canvas API 有两方面优势可以弥补:首先,不需要将所绘制图像中的每个图元当做对象存储,因此执行性能非常好;其次,在其他编程语言现有的优秀二维绘图 API 的基础上实现Canvas API 相对来说比较简单。毕竟,二鸟在林不如一鸟在手。”Peter 2.1.2 canvas是什么 在网页上使用canvas元素时,它会创建一块矩形区域。默认情况下该矩形区域宽为 300 像素,高为 150 像素,但也可以自定义具体的大小或者设置canvas元素的其他特性。代码清单 2-1是可放到 HTML 页面中的最基本的canvas元素。代码清单 2-1
6、 基本的canvas元素 24 第 2 章 Canvas API 在页面中加入了canvas元素后,我们便可以通过 JavaScript 来自由地控制它。可以在其中添加图片、线条以及文字,也可以在里面绘图,甚至还可以加入高级动画。大多数主流操作系统和框架支持的二维绘制操作,HTML5 Canvas API 都支持。如果你在近年来曾经有过二维图像编程的经验,那么会对 HTML5 Canvas API 感觉非常顺手,因为这个 API 就是参照既有系统设计的。如果没有这方面经验,则会发现与这么多年来一直使用的图片加 CSS 开发 Web 图形的方式比起来,Canvas 的渲染系统有多么强大。使用ca
7、nvas编程,首先要获取其上下文(context)。接着在上下文中执行动作,最后将这些动作应用到上下文中。可以将canvas的这种编辑方式想象成为数据库事务:开发人员先发起一个事务,然后执行某些操作,最后提交事务。2.1.3 canvas坐标 如图 2-1 所示,canvas中的坐标是从左上角开始的,x 轴沿着水平方向(按像素)向右延伸,y 轴沿垂直方向向下延伸。左上角坐标为x=0,y=0的点称作原点。2.1.4 什么情况下不用canvas 尽管canvas元素功能非常强大,用处也很多,但在某些情况下,如果其他元素已经够用了,就不应该再使用canvas元素。例如,用canvas元素在 HTML
8、 页面中动态绘制所有不同的标题,就不如直接使用标题样式标签(H1、H2 等),它们所实现的效果是一样的。图 2-1 canvas中的 x、y坐标 x 轴 y 轴 0,0 16,0 0,16 16,16 2.1 HTML5 Canvas 概述 25 1 2 3 4 6 9 11 7 5 8 10 2.1.5 替代内容 访问页面的时候,如果浏览器不支持canvas元素,或者不支持 HTML5 Canvas API 中的某些特性,那么开发人员最好提供一份替代代码(2.1.7 节中的表 2-1 详细介绍了浏览器对canvas的支持情况)。例如,开发人员可以通过一张替代图片或者一些说明性的文字告诉访问者
9、,使用最新的浏览器可以获得更佳的浏览效果。代码清单 2-2 展示了如何在canvas中指定替代文本,当浏览器不支持canvas的时候会显示这些替代内容。代码清单 2-2 在canvas元素中使用替代内容 Update your browser to enjoy canvas!除了上面代码中的文本外,同样还可以使用图片,不论是文本还是图片都会在浏览器不支持canvas元素的情况下显示出来。canvas元素的可访问性怎么样“提供替代图像或替代文本引出了可访问性这个话题很遗憾,这是 HTML5 Canvas 规范中明显的缺陷。例如,没有一种原生方法能够自动为已插入到canvas中的图片生成用于替换的
10、文字说明。同样,也没有原生方法可以生成替代文字以匹配由 Canvas Text API 动态生成的文字。在写本书的时候,暂时还没有其他方法可以处理canvas中动态生成的内容,不过已经有工作组开始着手这方面的设计了。让我们一起期待吧。”Peter 26 第 2 章 Canvas API 2.1.6 CSS 和canvas 同大多数 HTML 元素一样,canvas元素也可以通过应用 CSS 的方式来增加边框,设置内边距、外边距等,而且一些 CSS 属性还可以被canvas内的元素继承。比如字体样式,在canvas内添加的文字,其样式默认同canvas元素本身是一样的。此外,在canvas中为c
11、ontext设置属性同样要遵从 CSS 语法。例如,对context应用颜色和字体样式,跟在任何 HTML 和 CSS 文档中使用的语法完全一样。2.1.7 浏览器对 HTML5 Canvas 的支持 除了 Internet Explorer 以外,其他所有浏览器现在都提供对 HTML5 Canvas 的支持。不过,随后我们会列出一部分还没有被普遍支持的规范,Canvas Text API 就是其中之一,但是作为一个整体,HTML5 Canvas 规范已经非常成熟,不会有特别大的改动了。从表 2-1 中可以看到,写本书的时候,已经有很多浏览器支持 HTML5 Canvas 了。表2-1 浏览器
12、对HTML5 Canvas的支持 浏 览 器 支持情况 Chrome 从1.0版本开始支持 Firefox 从1.5版本开始支持 Internet Explorer 不支持 Opera 从9.0版本开始支持 Safari 从1.3版本开始支持 从上面的表格中可以看出,在所有浏览器中,只有 Internet Explorer 不支持 HTML5 Canvas。如果需要在 Internet Explorer 中使用canvas,可以选择使用名为 explorercanvas 的开源项目(http:/ explorercanvas 时,需要先判断当前浏览器是否是2.2 使用 HTML5 Canvas
13、 API 27 1 2 3 4 6 9 11 7 5 8 10 Internet Explorer,如果是则在页面中嵌入script标签来加载 explorercanvas。写法如下:开发者迫切希望 Canvas 可以受到广泛支持,因此不断有项目启动来尝试解决老浏览器或者非标准浏览器不支持 Canvas 的问题。微软已经宣布 Internet Explorer 9 将支持canvas,因此,所有主流浏览器都支持canvas已经指日可待了。由于各家浏览器对canvas的支持程度有差异,所以最好在使用 API 之前,先测试一下HTML5 Canvas 是否被支持。2.2.1 节会讲解怎样通过代码来
14、检测浏览器支持 Canvas 的情况。2.2 使用 HTML5 Canvas API 本节将深入探讨 HTML5 Canvas API。为此,我们将使用各种 HTML5 Canvas API 创建一幅类似于 LOGO 的图像,图像是森林场景,有树,还有适合长跑比赛的美丽跑道。虽然这个示例从平面设计的角度来看毫无竞争力,但却可以合理演示 HTML5 Canvas 的各种功能。2.2.1 检测浏览器支持情况 在创建 HTML5 canvas元素之前,首先要确保浏览器能够支持它。如果不支持,你就要为那些古董级浏览器提供一些替代文字。代码清单 2-3 就是检测浏览器支持情况的一种方法。代码清单 2-3
15、 检测浏览器支持情况 try document.createElement(canvas).getContext(2d);document.getElementById(support).innerHTML=HTML5 Canvas is supported in your browser.;catch(e)document.getElementById(support).innerHTML=HTML5 Canvas is not supported 28 第 2 章 Canvas API in your browser.;上面的代码试图创建一个canvas对象,并且获取其上下文。如果发生错误
16、,则可以捕获错误,进而得知该浏览器不支持canvas。页面中预先放入了 ID 为support的元素,通过以适当的信息更新该元素的内容,可以反映出浏览器的支持情况。以上示例代码能判断浏览器是否支持canvas元素,但不会判断具体支持canvas的哪些特性。写本书的时候,示例中使用的 API 已经很稳定并且各浏览器也都提供了很好的支持,所以通常不必担心这个问题。此外,希望开发人员能够像代码清单 2-3 一样为canvas元素提供备用显示内容。2.2.2 在页面中加入canvas 在 HTML 页面中插入canvas元素非常直观。代码清单 2-4 就是一段可以被插入到 HTML页面中的canvas
17、代码。代码清单 2-4 canvas元素 以上代码会在页面上显示出一块 200200 像素的“隐藏”区域。假如要为其增加一个边框,可以像代码清单 2-5 中的代码一样,用标准 CSS 边框属性来设置。代码清单 2-5 带实心边框的canvas元素 注意,上面的代码中增加了一个值为“diagonal”的 ID 特性,这么做的意义在于以后的开2.2 使用 HTML5 Canvas API 29 1 2 3 4 6 9 11 7 5 8 10 发过程中可以通过 ID 来快速找到该canvas元素。对于任何canvas对象来说,ID 特性都是特别重要的,因为对canvas元素的所有操作都是通过脚本代码
18、控制的,没有 ID 的话,想要找到要操作的canvas元素会很难。代码清单 2-5 在浏览器中的执行效果如图 2-2 所示。图 2-2 HTML页面中的简单canvas元素 看起来好像没什么,但是就像那些艺术家说的,一张白纸可以画出最新最美的图画。现在,就让我们在这张“白纸”上作画吧。前面说过,在没有 HTML5 Canvas 的情况下,很难在页面上绘制一条对角线。现在我们来看看,有了 Canvas 以后,同样的事情会有多么简单。从代码清单2-6 中可以看到,基于上面绘制的画布,仅仅使用几行代码就可以画出一条对角线。代码清单 2-6 在canvas中绘制一条对角线 function drawD
19、iagonal()/取得 canvas 元素及其绘图上下文 var canvas=document.getElementById(diagonal);var context=canvas.getContext(2d);/用绝对坐标来创建一条路径 context.beginPath();context.moveTo(70,140);context.lineTo(140,70);/将这条线绘制到 canvas 上 context.stroke();30 第 2 章 Canvas API window.addEventListener(load,drawDiagonal,true);仔细看一下上面这
20、段绘制对角线的 JavaScript 代码。虽然简单,它却展示出了使用 HTML5 Canvas API 的重要流程。首先通过引用特定的canvas ID 值来获取对canvas对象的访问权。这段代码中 ID 就是diagonal。接着定义一个context变量,调用canvas对象的getContext方法,并传入希望使用的canvas类型。代码清单中通过传入“2d”来获取一个二维上下文,这也是到目前为止唯一可用的上下文。提示 规范未来的某个版本中可能会增加对三维上下文的支持。接下来,基于这个上下文执行画线的操作。在代码清单中,调用了三个方法beginPath、moveTo和lineTo,传
21、入了这条线的起点和终点的坐标。方法moveTo和lineTo实际上并不画线,而是在结束canvas操作的时候,通过调用context.stroke()方法完成线条的绘制。图 2-3 显示了绘制结果。图 2-3 canvas中的对角线 成功了!虽然从这条简单的线段怎么也想象不到最新最美的图画,不过与以前的拉伸图像、怪异的 CSS 和 DOM 对象以及其他怪异的实现形式相比,使用基本的 HTML 技术在任意两点间2.2 使用 HTML5 Canvas API 31 1 2 3 4 6 9 11 7 5 8 10 绘制一条线段已经是非常大的进步了。从现在开始,就把那些怪异的做法永远忘掉吧。从上面的代
22、码清单中可以看出,canvas中所有的操作都是通过上下文对象来完成的。在以后的canvas编程中也一样,因为所有涉及视觉输出效果的功能都只能通过上下文对象而不是画布对象来使用。这种设计使canvas拥有了良好的可扩展性,基于从其中抽象出的上下文类型,canvas将来可以支持多种绘制模型。虽然本章经常提到对canvas采取什么样的操作,但读者应该明白,我们实际操作的是画布所提供的上下文对象。如前面示例演示的那样,对上下文的很多操作都不会立即反映到页面上。beginPath、moveTo以及lineTo这些函数都不会直接修改canvas的展示结果。canvas中很多用于设置样式和外观的函数也同样不
23、会直接修改显示结果。只有当对路径应用绘制(stroke)或填充(fill)方法时,结果才会显示出来。否则,只有在显示图像、显示文本或者绘制、填充和清除矩形框的时候,canvas才会马上更新。2.2.3 变换 现在我们探讨一下在canvas上绘制图像的另一种方式使用变换(transformation)。接下来的代码清单显示结果跟上面是一样的,只是绘制对角线的代码不一样。这个简单示例可能会让你误认为使用变换增加了不必要的复杂性。事实并非如此,其实变换是实现复杂canvas操作的最好方式。在后面的示例中将会看到,我们使用了大量的变换,而这对熟悉 HTML5 Canvas API的复杂功能是至关重要的
24、。也许了解变换最简单的方法(至少这种方法不涉及大量的数学公式,也不需手足并用地去解释)就是把它当成是介于开发人员发出的指令和canvas显示结果之间的一个修正层(modification layer)。不管在开发中是否使用变换,修正层始终都是存在的。修正在绘制系统中的说法是变换在应用的时候可以被顺序应用、组合或者随意修改。每个绘制操作的结果显示在canvas上之前都要经过修正层去做修正。虽然这么做增加了额外的复杂性,但却为绘制系统添加了更为强大的功能,可以像目前主流图像编辑工具那样支持实时图像处理,所以 API 中这部分内容的复杂性是必要的。不在代码中调用变换函数并不意味着可以提升canvas
25、的性能。canvas在执行的时候,变换会被呈现引擎隐式调用,这与开发人员是否直接调用无关。在接触最基本的绘制操作之前,提前了解系统背后的原理至关重要。关于可重用代码有一条重要的建议:一般绘制都应从原点(坐标系中的0,0点)开始,应用变换(缩放、平移、旋转等),然后不断修改代码直至达到希望的效果。如图 2-4 所示。32 第 2 章 Canvas API 代码清单 2-7 展示了如何使用最简单变换方法translate函数。图 2-4 基于原点绘制和变换的示意图 代码清单 2-7 用变换的方式在canvas上绘制对角线 function drawDiagonal()var canvas=docu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- HTML5高级程序设计 2 HTML5 高级 程序设计
限制150内