1.事件处理机制.
2.创建类库.
3.使用 回调函数.
3.1.示例: CFEventClass 类(简单的示例).
3.2.示例: CFTimer 类(定时器).
4.使用 addListener 方法(AsBroadcaster / BroadcasterMX 类).
4.1.示例: AsBEventClass 类(简单的示例).
4.2.示例: AsBTimer 类(定时器).
5.使用 addEventListener 方法(EventDispatcher 类).
5.1.示例: EDEventClass 类(简单的示例).
5.2.示例: EDTimer 类(定时器).
6.建立强大的事件处理机制.
6.1.创建 CFDelegate 类(修改 Delegate 类).
6.2.创建 CFEventDispatcher 类(修改 EventDispatcher 类).
6.3.创建 Event 类(事件基类,继承 Object 类).
6.4.创建 IOErrorEvent 类(错误事件类,继承 Event 类).
6.5.创建 HTTPStatusEvent 类(http状态事件类,继承 Event 类).
6.6.示例: EventClass 类(简单的示例).
6.7.示例: Timer 类(定时器,功能跟 AS3 中的 Timer 类一样).
7.小结.
源文件(LRC 和 CFSound 类也在这):Flash Class Library.rar
[1.事件处理机制]
AS2 的事件处理机制并不完美.形态多样.不易于管理.在这里可以解决此问题的一半.本文会先了解和使用
AS2 中基本的事件处理机制.然后建立强大的事件处理机制.来方便管理自己的程序.下面讲解.
形态多样的事件处理机制(后面会详细的讲解):
1.回调函数.(如 onLoad, onHTTPStatus 等)
2.使用 addListener 方法. (如 onLoadStart, onLoadInit 等)
3.使用 addEventListener 方法. (如 click, change 等)
它们的作用域和形态(代码):
作用域是指标识符(如常量、数据类型、变量或例程)在程序内可被引用的范围.
1.this 指向触发此事件的对象
object.onLoad = function()
{
trace(this); //输出: object
}
2.this 指向侦听器对象
var listenerObject:Object = {};
listenerObject.onLoadStart = function()
{
trace(this); //输出: listenerObject
}
broadcasterObject.addListener(listenerObject);
3.使用侦听器对象:this 指向侦听器对象
var listenerObject:Object = {};
listenerObject.click = function(evt:Object)
{
trace(this); //输出: listenerObject
}
broadcasterObject.addEventListener("click", listenerObject);
使用函数:this 指向触发此事件的对象
function clickHandler(evt:Object):Void
{
trace(this); //输出: broadcasterObject
}
broadcasterObject.addEventListener("click", clickHandler);
有时我们需要更改它们的作用域怎么办?
想要改变它们的作用域,需使用 Delegate 类的 create 方法.
此类的全路径: mx.utils.Delegate;
用法: Delegate.create(要运行函数的范围, 函数);
例:
1.this 指向 _level0
import mx.utile.Delegate;
object.onLoad = Delegate.create(this, _onLoad);
function _onLoad():Void
{
trace(this); //输出: _level0
}
2.this 指向 _level0
import mx.utile.Delegate;
var listenerObject:Object = {};
listenerObject.onLoadStart = Delegate.create(this, loadStart);
function loadStart():Void
{
trace(this); //输出: _level0
}
broadcasterObject.addListener(listenerObject);
3.
使用侦听器对象:this 指向 _level0
import mx.utile.Delegate;
var listenerObject:Object = {};
listenerObject.click = Delegate.create(this, clickHandler);
function clickHandler(evt:Object)
{
trace(this); //输出: _level0
}
broadcasterObject.addEventListener("click", listenerObject);
使用函数:this 指向 _level0
function clickHandler(evt:Object):Void
{
trace(this); //输出: _level0
}
broadcasterObject.addEventListener("click", Delegate.create(this, clickHandler));
事件对象:
它包含两个基本属性:
type:String 事件名.
target:Object 事件源.此属性可以不指定,默认为事件源(调用dispatchEvent方法的对象).
此对象传递给 EventDispatcher 类的 dispatchEvent 方法并作为参数传递到侦听器.
例:
//发送事件.
dispatchEvent({type:"click", target:this});
//事件处理函数.
function clickHandler(evt:Object):Void
{
trace([evt.type, evt.target]);
}
//添加事件侦听器.
addEventListener("click", clickHandler);
下一节讲:[2.创建类库]
在开始下面的教程之前.先要创建类库.在硬盘中创建如图结构的文件目录:

Classes 目录是用来存放类文档.
Example 目录是用来存放示例文档.
创建好后还需要在 Flash 中添加类路径:
Flash 8: 编辑-->首选参数-->ActionScript-->ActionScript 2.0 设置-->添加(+)-->浏览到 Flash Class Library/Classes 目录.

Flash CS3: Edit-->Preferences-->ActionScript-->ActionScript 2.0 Settings-->Add New Path(+)-->Browse To Flash Class Library/Classes 目录.
ActionScript 3.0 也要添加(在后续文章中会用到).

下一节讲: [3.使用 回调函数]
[3.使用 回调函数]
回调函数也可以说是匿名函数,先看下面的代码:
var myXML:XML = new XML();
myXML.load("xml.xml");
myXML.onLoad = function(success:Boolean)
{
trace(success);
}
XML.onLoad 是一个回调函数.将匿名函数与特定的事件关联,以创建回调函数.函数将在特定事件发生后调用回调函数.
在自定义类中怎么做呢?看下面的示例.