HTML5中最受开发者期待的一项新特性莫过于Canvas(画布)元素了。Canvas元素提供了一个可以动态渲染图形和位图的位图画布。它非常类似于Flash中的Bitmap和BitmapData两个类。
但是,要使用Canvas还是有点难度的,特别是如果你还想管理,重绘或者运动图形或图片。与Flash播放器不同的是Canvas没有显示队列或显示个别项目这种概念,它提供一个用于绘图的画布,画什么以及什么时候画都取决于开发者。
Grant Skinner放出了一个名为EaselJS的JavaScript库,视图提供一个类似于Flash的DisplayList API用于简化Canvas的开发工作。虽然这个库目前还在内测阶段,但是却在早期就诶的就支持全部特性。如果你对Canvas感兴趣,那么这将是一个非 常好的起点。
在这篇文章中,我将展示如何使用EaselJS来实现Canvas的动画效果。
下面是一个库中主要类的列表:
1.DisplayObject:所有EaselJS中显示元素的抽象基类。包含所有显示元素的公用属性(例如:x,y,角度,x比例,y比例,透明度,阴影等等)。
现在,在我们开始之前,让我们先看一下你在哪能够用到Canvas对象。Canvas是HTML5标准中的一部分,已经被大多数现代浏览器的最新版本所支持,包括:
Safari
Google Chrome
Opera
FireFox
(IE9业已支持 译者注)
但是,还有一个问题,并且这是个大问题。IE并没有支持Canvas对象(虽然下一个版本会支持)。根据NetMarketShare的数 据,IE6,7,8占据了57%的浏览器市场,是用户最多的一部分。有个叫ExplorerCanvas的项目试图使IE支持Canvas,但是 EaselJS为测试与它的兼容性。当你考虑用Canvas的时候请牢记这点。
现在我们有了一个是哦那个Canvas的好主意,先让我们看一个简单点例子。在示例中,我们将使用EaselJS动态的画一个圆并且移动它穿过画布。这个示例将会展示如何按照类库,介绍一下使用类库的一些基本概念,并且展示如何运动一个图形。
下面是例子
现在让我们看一下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="author" content="Mike Chambers" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta name="copyright" content="Mike Chambers" />
<meta name="robots" content="index,follow" />
<title>TITLE</title>
<style>
#stageCanvas
{
background-color:#333333;
}
</style>
<!-- 导入Easel库,下载地址 http://easeljs.com/-->
<script src="scripts/easeljs.js"></script>
<script>
//检查Canvas在当前浏览器是否支持
//http://diveintohtml5.org/detect.html#canvas
if(!(!!document.createElement("canvas").getContext))
{
var wrapper = document.getElementById("canvasWrapper");
wrapper.innerHTML = "Your browser does not appear to support " + "the HTML5 Canvas element";
return;
}
//EaselJS Stage实例包含Canvas元素
var stage;
//EaselJS Shape示例我们将做成动画
var circle;
//圆的半径
var CIRCLE_RADIUS = 10;
//x坐标,当圆离开屏幕的时候
var circleXReset;
//EaselJS Rectangle(矩形)实例用于存储Canvas的边界值
var bounds = new Rectangle();
//初始化函数
function init()
{
//通常这里我们会做一些Canvas的嗅探工作.
//浏览http://www.modernizr.com/有个用于HTML5嗅探非常有用的库
//获取Canvas对象的引用
var canvas = document.getElementById("stageCanvas");
//复制画布绑定到边界实例
//注意,如果我们改变了画布的大小,我们需要同时改动这些边界
bounds.w = canvas.width;
bounds.h = canvas.height;
//pass the canvas element to the EaselJS Stage instance
//The Stage class abstracts away the Canvas element and
//is the root level display container for display elements.
stage = new Stage(canvas);
//创建一个EaselJS图形元素用来创建画圆的命令
var g = new Graphics();
//1px的画笔
g.setStrokeStyle(1);
//设置画笔颜色, 使用EaselJS
//Graphics.getRGB静态方法.
//创建了一个透明度为.7的白色
g.beginStroke(Graphics.getRGB(255,255,255,.7));
//画这个圆
g.drawCircle(0,0, CIRCLE_RADIUS);
//注意过圆现在并未真正的被画出来
//图形实例只是具有画圆的命令
//它在stage需要渲染的时候才被画出来
//通常在我们调用stage.tick()的时候
//创建一个新的图形实例. 这是一个可以添加到stage中并可以被渲染的显示对象
//Pass in the Graphics instance that we created, and that
//we want the Shape to draw.
circle = new Shape(g);
//初始化x坐标,并初始化
circle.x = circleXReset = -CIRCLE_RADIUS;
//设置y坐标
circle.y = canvas.height / 2;
//将圆加入到舞台
stage.addChild(circle);
//让stage开始渲染
stage.tick();
//添加Tick类的订阅.这会每隔一段时间就调用tick方法
//(就像Flash中的ENTER_FRAME)
Tick.addListener(this);
}
//每隔一定时间被Tick调用的函数
function tick()
{
//检查图像是否超出了stage的右边界
if(circle.x > bounds.w)
{
//如果有,则重置
circle.x = circleXReset;
}
//将圆的x坐标移动10像素
circle.x += 10;
//重新渲染stage
stage.tick();
}
</script>
</head>
<body on load ="init()">
<div width="400" height="300" id="canvasWrapper">
<canvas width="400" height="300" id="stageCanvas"></canvas>
</div>
</body>
</html>
你可以看到,代码是相当的简单,并且它的结构也非常类似使用Flash中的DisplayList API。有一些非常重要的地方需要指出。
EaselJS Stage示例包含Canvas元素,并且处理所有的内容什么时候如何渲染。只有当你调用stage.tick()的时候stage才渲染,并且为了效率方面的考虑,你仅需要在有内容发生更改或者需要重绘画布的时候再调用这个方法。Tick类用于处理时间管理。当任何一个观察者对象被通知的时候它将调用一个tick方法。这与ActionScript中的ENTER_FRAME事件类似。
如果你改变了画布的大小,它的内容会被清空。然而,如果你使用EaselJS,唯一你需要做的就是在改变画布大小后调用stage.tick()方法,然后画布会重新渲染。
由于IE缺乏对Canvas的支持,你探测浏览器是否支持Canvas的工作变得非常重要,你最好给用户一个可以接受的回落。上面的示例代码中有简 单的示范,同样你也可以使用Modernizr JavaScript Library这个库,这个库提供了检查浏览器对HTML5特性支持的API。
最后,当前版本是一个早期版本,因此APIs有可能发生改变。另外,有些你期望能用的内容可能尚未支持。例如,当前还没有能够获取一个显示对象高度或宽带的方法(你可能自己已经发现了)。然而不管怎么样,这个库还是非常健壮的,并且已经应用到一下产品级的项目中了。