HTML5开发之Canvas绘图之实战入门

日期: 2012-08-26 来源:TechTarget中国 英文

  作为HTML5中新引入的重要标签之一,Canvas元素使得Web开发人员可以直接使用JavaScript脚本在Web页面进行绘图。这样,作为第三方插件的Flash,就彻底的Out了。本文的目标是指导读者如何使用Canvas标签以及相应的JavaScript API,实现基于Web的绘图功能。

  大家都知道,乔布斯从来都与Flash摆出一副水火不相容的态势。这就是为什么从iPad到iPhone,苹果移动设备就从未支持过Flash。对于苹果来说,除了拿Flash的性能说事儿以外,恐怕也有自家技术排挤它人的想法作祟吧?毕竟自家有很多HTML5的法宝嘛!Canvas技术就是其中之一。

  实际上,Canvas首次由苹果公司的Webkit框架引入实现,并成功运用在Safari浏览器中。目前,Canvas已成为HTML5规范中的事实性标准,并先后被Firefox,Safari,Chrome,Opera,IE等浏览器所支持。

  如此一来,Canvas的绘图功能就为各种网页制图,以及2D/3D游戏奠定了强大的基础。

  Canvas标签和SVG以及VML之间的差异

  Canvas标签和SVG以及VML之间的一个重要的不同是, 有一个基于JavaScript绘图API,而SVG和VML使用一个XML文档来描述绘图。

  这两种方式在功能上是等同的,任何一种都可以用另一种来模拟。从表面上看,它们很不相同,可是,每一种都有强项和弱点。例如,SVG绘图很容易编辑,只要从其描述中移除元素就行。

  要从同一图形的一个 Canvas标签中移除元素,往往需要擦掉绘图重新绘制它。

  下面,我们分三部分示例介绍如何使用Canvas标签以及相应的JavaScript API在Web页面绘图。

  绘图初级篇矩形

  在做基本的绘图之前,我们先来介绍Canvas标签的声明。作为一个HTML标签,Canvas的声明方式如下:

  您的浏览器不支持Canvas!

  我们声明了一个Canvas标签,对应的ID为canvas。Canvas标签的属性说明如下:

  属性

  需要指明的是,由于无法保证所有用户使用的浏览器都能够支持 Canvas 元素,所以在目前开发基于Canvas 的Web 应用中需要增加相应的不兼容文字,以提示用户他们无法正常体验此功能的原因或建议他们去下载最新的浏览器。

  实际上,单独的一个 canvas 标记只是在页面中定义了一块矩形区域,并无特别之处,开发人员只有配合使用 JavaScript 脚本,才能够完成各种图形,线条,以及复杂的图形变换操作。

  为了演示最基本的绘图,接下来,我们通过Javascript代码绘制一个红色的矩形。代码部分如下:
  

  !DOCTYPE HTML>
  html>
  body>
  canvas >您的浏览器不支持Canvas!
  script type=text/javascript>
  ctx.fillStyle=#FF0000;
  ctx.fillRect(0,0,80,100);
  script>
  body>
  html>

  之所为Canvas标签指定id,是为了在 JavaScript 脚本中获取该 DOM 实例对象。如下:

  需要注意的是,基于 Canvas 的绘图并不是直接在 Canvas 标签所创建的绘图画面上进行各种绘图操作,而是依赖画面所提供的渲染上下文,所有的绘图命令和属性都定义在渲染上下文当中。

  在通过Canvas id 获取相应的 DOM 对象之后首先要做的事情就是获取渲染上下文对象。 渲染上下文与Canvas一一对应,无论对同一Canvas对象调用几次 getContext() 方法,都将返回同一个上下文对象。

  ctx.fillStyle=#FF0000;
  ctx.fillRect(0,0,80,100);

  目前,所有支持 canvas 标签的浏览器都支持 2D 渲染上下文。

  最后的效果图:

HTML5开发之Canvas绘图之实战入门

  绘图中级篇半圆

  前面我们演示的是如何绘制最基本的图形矩形。非常简单。需要明确的是,Canvas基于矩形绘制的API 是一种即时性的 API,也就是说,Canvas标签会在相应的绘图函数执行完毕之后,将图形即时的渲染在网页上。

  半圆的绘制会复杂一些,因为涉及到弧线,换句话说。这是一种基于路径的制图。

  下面,我们演示如何在网页上画一个基于路径Canvas API的半圆。代码部分如下:

  !DOCTYPE HTML>
  html>
  body>
  canvas >您的浏览器不支持Canvas!
  script type=text/javascript>
  ctx.fillStyle = #00f;
  ctx.strokeStyle = #f00;
  ctx.beginPath();
  ctx.arc(75,75,30,0,Math.PI, false);
  ctx.closePath();
  ctx.fill();
  ctx.stroke();
  script>
  body>
  html>

  其中,在每个 Canvas 实例对象中都拥有一个 path 对象,创建自定义图形的过程就是不断对 path 对象操作的过程。每当开始一次新的图形绘制任务,都需要先使用 beginPath() 方法来重置 path 对象至初始状态,中间是一系列画线方法的调用,最后是最后一步,也是可选的步骤,是调用 closePath() 方法将自定义图形进行闭合,该方法将自动创建一条从当前坐标到起始坐标的直线。

  ctx.beginPath();
  ctx.closePath();

  位于beginPath() 方法与closePath() 方法之间的ctx.arc目的是绘制一条半圆弧线。

  ctx.arc(75,75,30,0,Math.PI, false);

  最后的效果图:

HTML5开发之Canvas绘图之实战入门

 

  绘图高级篇 复杂位图

  刚才介绍的是如何使用Canvas标签以及JavaScript API绘制矩形与半圆。其中,绘制矩形最为简单,由于涉及到曲线路径,半圆的绘制稍微复杂一点。接下来,我们介绍另一个高级概念绘画状态(Drawing state)。绘画状态反映了渲染上下文当前的瞬时状态,Web开发人员可以通过对绘画状态的保存与恢复操作而快速的回到之前使用的各种属性和变形操作。

  下面,我们演示如何在网页上使用平移/旋转变形方法绘制复杂位图。代码部分如下:

  !DOCTYPE HTML>
  html>
  body>
  canvas >您的浏览器不支持Canvas!
  script type=text/javascript>
  ctx.translate(150,150);
  for (i=1;i2;i++){
  if ((i % 2) == 1) {
  ctx.fillStyle = #00f;
  } else {
  ctx.fillStyle = #f00;
  ctx.save();
  for (j=0;ji*6;j++){
  ctx.rotate(Math.PI/(3*i));
  ctx.beginPath();
  ctx.arc(0,20*i,5,0,Math.PI*2,true);
  ctx.fill();
  ctx.restore();
  script>
  body>
  html>

  其中,开发人员可以使用save和restore两种方法分别保存和恢复Canvas状态。实际上,维护绘画状态的结构可以认为是一个栈,而save与restore方法则相当于push与pull方法。每调用save方法,都会将当前状态压入堆栈中,而相应的restore方法则会从堆栈中弹出一个状态,并将当前画面恢复至该状态。

  ctx.save();
  ctx.restore();

  作为一种常见操作,translate方法用于支持二维绘图的平移,rotate方法支持二维绘图的旋转。类似地,scare方法支持二维绘图的伸缩。
  最后的效果图:

HTML5开发之Canvas绘图之实战入门

  总结

  本文对HTML5新引入的Canvas标签在Web绘图中所扮演的角色和所发挥的作用做了最基本的介绍,其中包括使用Canvas以及相关API完成基本的 矩形,半圆,位图。与Flash等绘图技术相比,Canvas是一种不依赖任何插件的标准Web像素级绘图技术。随着各大浏览器厂商的加入,Canvas势必会更加成熟完善,也会有更多基于Canvas的绘图类应用不断涌现。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • AWS MEAN堆栈+JavaScript=快速搭建应用

    开发人员在构建Web应用时有许多选择。市面上有无数的框架和语言可选,而像AWS这样的云平台可以方便地部署和扩展应用程序。

  • 对话陈本峰:HTML5究竟给企业带来了什么?

    智能手机的普及,移动计算的应用,带火了HTML5技术。尤其,当我们看到微软朋友圈被“故宫与腾讯合作”的广告刷屏,我们不得不承认,HTML5技术确实很重要,但是HTML5究竟带来了什么,与以往移动技术有什么不同?

  • HTML5促进企业移动化服务走向极致

    在企业困扰于传统移动化方式过于复杂时, HTML5凭借其天然的跨平台特性,乘势而起并逐渐得到企业的关注。可是,由于HMTL5标准建立时间不长,展示性能及稳定性更是需要和浏览器有一个良好的兼容,除此之外企业更是缺乏实际应用经验,所以基于HTML5技术的企业级服务市场还处于一片初创状态。

  • HTML5如何在企业中深入使用?

    据调查显示全球拥有490亿 在线设备,比人口数量多几倍,这说明平均每人拥有不只一部分在线设备。由此可见,全球移动生态系统是多么的庞大。