《ActionScript 3.0 Cookbook》读书笔记1.3

管理事件

在ActionScript2.0中,我已经习惯使用addEventListener()来为V2版组件添加事件处理器。同时也习惯了使用EventDispatcher来发布事件。没想到ActionScript 3.0已经把addEventListener作为标准的事件机制了。这真是个好消息。

ActionScript 3.0使用flash.events包把所有的事件类集中在一起。例如,enterFrame事件被放在flash.events.Event类中;鼠标事件被放在flash.events.MouseEvent类中;键盘事件则被放在flash.events.KeyboardEvent类中,等等。

现在,要使用ActionScript 2.0时代的onEnterFrame事件,需要这么写:

1//构造类...
2import flash.events.Event;
3//其他代码...
4addEventListener(Event.ENTER_FRAME, onEnterFrame);
5//其他代码...
6private function onEnterFrame(event:Event) {
7//处理代码
8}

当然,事件管理函数名称倒不一定必须是“onEnterFrame”。至于鼠标事件和按键事件,使用方法也都差不多。Adobe把所有的事件都集中在一个包中管理,并且全部用常量来描述事件名称,确实比原来松散的管理方式要方便许多了。

时间间隔

在ActionScript 1、2时代,对于要按照特定的时间间隔重复的程序,我们似乎只能使用setInterval或onEnterFrame。现在好了,有个更好的东东可以用,那就是Timer类。

首先导入Timer类并建立Timer类的实例,Timer类在flash.utils包中。下面的程序创建一个每500毫秒重复一次的timer实例,一共重复100次。

1import flash.utils.Timer;
2var timer:Timer = new Timer(500, 100);

Timer类的实例在工作间隔中会发出TIMER事件,通过为这个事件指定事件管理函数,就可以达到按特定事件间隔执行程序的目的。当然,这个事件也在flash.events包中。

加入事件侦听器后,还需要使用start()方法来启动timer实例的运行。

 1import flash.utils.Timer;
 2import flash.events.TimerEvent;
 3//其他代码...
 4var timer:Timer = new Timer(500, 100);
 5timer.addEventListener(TimerEvent.TIMER, onTimer);
 6timer.start();
 7//其他代码..
 8private function onTimer(evt:TimerEvent):void{
 9//事件处理代码...
10}

如果希望执行没有次数限制的Timer,则在建立timer实例时将第二个参数设为0即可。要停止timer实例的运行,则可以使用stop()方法。

尽管Timer类如此好用,但本书的作者还是给了我们两条忠告:

  1. Don't rely on timers to be extremely precise.
  2. Don't rely on timer intervals to be smaller than approximately 10 milliseconds.

10毫秒?我们会用Flash做这么精确的事情么?