Flash AS2 事件处理机制

本教程中你将学习下面的内容:        1.事件处理机制.
! ~6 [- m& ]$ V" @% S9 j       2.创建类库.$ ~5 o* J2 x8 z5 {; d/ N
       3.使用 回调函数.
7 G, ]4 A8 p% _              3.1.示例: CFEventClass 类(简单的示例).
) K# {5 C$ `$ u, x( d              3.2.示例: CFTimer 类(定时器).6 @% p& u% s& `$ a/ n; Q) T
       4.使用 addListener 方法(AsBroadcaster / BroadcasterMX 类).
; C& {% r5 i+ W/ V              4.1.示例: AsBEventClass 类(简单的示例).
) K- D# ^4 b! {: }" q; U, D              4.2.示例: AsBTimer 类(定时器).
: N: `' m8 j" I4 v8 ^( }       5.使用 addEventListener 方法(EventDispatcher 类).5 Q3 t6 d1 J( o# _& G- K( |
              5.1.示例: EDEventClass 类(简单的示例).- @/ G; t6 k! S; @8 [- J5 ]
              5.2.示例: EDTimer 类(定时器).
- e' T! }% A3 I2 ~$ G, h- m       6.建立强大的事件处理机制.
3 A( m$ d& S0 b' U, {) ~              6.1.创建 CFDelegate 类(修改 Delegate 类).9 m) d  Z0 i/ ^4 d
              6.2.创建 CFEventDispatcher 类(修改 EventDispatcher 类).
+ F5 |8 S' A5 C' {" b              6.3.创建 Event 类(事件基类,继承 Object 类).
, j% c( I# C" x9 g              6.4.创建 IOErrorEvent 类(错误事件类,继承 Event 类).
7 u& e  Q0 s8 n/ {" Q6 W  o- ~1 _0 e; S              6.5.创建 HTTPStatusEvent 类(http状态事件类,继承 Event 类).
$ P2 _" ?2 @9 V6 S              6.6.示例: EventClass 类(简单的示例).% |* d2 C2 @: Z6 `0 [
              6.7.示例: Timer 类(定时器,功能跟 AS3 中的 Timer 类一样).
; `3 M* X2 u9 E, x6 c# S9 w       7.小结.5 ~$ W0 a# j/ J( R9 ^( m5 L8 Y
源文件(LRC 和 CFSound 类也在这):Flash Class Library.rar4 {9 r. ]* ]2 i
[1.事件处理机制]
5 ~8 T, c: I- N5 D. F1 mAS2 的事件处理机制并不完美.形态多样.不易于管理.在这里可以解决此问题的一半.本文会先了解和使用! T, y# o$ h+ {% q$ E
AS2 中基本的事件处理机制.然后建立强大的事件处理机制.来方便管理自己的程序.下面讲解.
# [6 }4 T9 g- b6 G& d2 }/ M8 k形态多样的事件处理机制(后面会详细的讲解):
5 m+ \/ K. U  G% a1.回调函数.(如 onLoad, onHTTPStatus 等)% J& G9 Q7 {4 w$ O3 u: l
2.使用 addListener 方法. (如 onLoadStart, onLoadInit 等). x4 S: T/ \+ c; l0 ?: V
3.使用 addEventListener 方法. (如 click, change 等)8 R  [1 X2 f/ p7 L
它们的作用域和形态(代码):/ H5 u" V; ~9 _; j) j& U
作用域是指标识符(如常量、数据类型、变量或例程)在程序内可被引用的范围.& b" i: k8 u( @5 p7 k2 i" U* K
1.this 指向触发此事件的对象
2 D7 n/ j# M7 i3 W) M% I* i5 Xobject.onLoad = function()$ d# a2 l; o: \2 Q9 B' W1 V% O+ _5 n" }
{; j5 J, B6 I" U: ?' [" b! J, [
    trace(this); //输出: object2 ?: i8 b9 L* z
}2 z# d$ T( s% h% L3 P
2.this 指向侦听器对象
! ?3 ~$ I  r: y8 T8 C6 Z0 Ivar listenerObject:Object = {};
, `0 U1 z2 C3 v3 W8 |2 A: i! PlistenerObject.onLoadStart = function()6 d7 P. \: @& m) T, [$ F
{* i. y8 ?5 ?1 E
    trace(this); //输出: listenerObject
2 B  d+ }# Y9 {2 O. p}* f5 j8 E) }5 G
broadcasterObject.addListener(listenerObject);
9 j) K8 ]5 Z( t+ z3.使用侦听器对象:this 指向侦听器对象% L  \; E+ M0 o/ }; ]! s
var listenerObject:Object = {};
- S& G8 e) T" H( W( o: r1 a3 H0 J) {listenerObject.click = function(evt:Object)5 L$ f( B4 t7 c/ q
{. T1 D7 E0 p8 g) _  N( r: |
    trace(this); //输出: listenerObject" c  s* Y/ c2 g1 V
}
! K( m$ _& Y+ W: hbroadcasterObject.addEventListener("click", listenerObject);9 h' R  ?  F; _
使用函数:this 指向触发此事件的对象
# }3 ~! m/ E5 d9 t: t) ^! tfunction clickHandler(evt:Object):Void
, |- H; L3 L5 ?6 l. b& ^5 D{# ]3 }# H9 s  b! L- \, c
    trace(this); //输出: broadcasterObject
0 _1 B! o) |( S* F. r}+ o+ q8 s, s6 m/ g6 u6 C
broadcasterObject.addEventListener("click", clickHandler);) I4 N) z8 u- M* p+ J" g

3 ~2 M6 |) O: `有时我们需要更改它们的作用域怎么办?% ^  E  B+ ~) V: o5 `
想要改变它们的作用域,需使用 Delegate 类的 create 方法.1 L. ~9 ^3 `9 t* G9 p9 ]
此类的全路径: mx.utils.Delegate;
- r. B  d% ?, y# H" c8 x! d, H用法: Delegate.create(要运行函数的范围, 函数);
/ {0 R6 O$ P4 D* M  y2 ^! E例:" \: _6 a+ j7 `4 j  y
1.this 指向 _level0. K3 u/ q, X9 o, }  Q
import mx.utile.Delegate;
* Y, _7 W) e( H0 _# x" q, nobject.onLoad = Delegate.create(this, _onLoad);) l9 I$ y1 Z. H' V# J
function _onLoad():Void$ r7 U, z( D+ ~% q% {
{
( g# z8 W+ q, p8 R    trace(this); //输出: _level0; j3 J3 g7 b3 B) K
}
+ v5 D/ N( B* E7 m3 J1 u, o2.this 指向 _level0
6 g1 ?, h3 _. ?( c1 gimport mx.utile.Delegate;
7 p) C; z( H* `' |1 o6 V% \5 zvar listenerObject:Object = {};
, Z/ `0 ?/ p# c8 I, V5 ]5 }listenerObject.onLoadStart = Delegate.create(this, loadStart);
9 v/ d" t5 |' e  ~3 Q: a3 e7 F. hfunction loadStart():Void; O. k. h* X. z$ S2 ?/ ~- o
{
& X1 \- C- p9 o0 F# c' b    trace(this); //输出: _level0
4 v5 n6 _, p$ q& p9 z6 W2 {- v}
# U8 O4 g. q4 H, i; IbroadcasterObject.addListener(listenerObject);# i+ |" d7 q% R9 J3 P4 A. K' V! A$ v9 d
3., f  ?4 e+ J: i+ {5 X7 L
使用侦听器对象:this 指向 _level0$ [; [: D4 B8 h4 I: S; D
import mx.utile.Delegate;
0 G- Q6 l, M9 S% ?3 l$ P* C. ^var listenerObject:Object = {};
2 e- I# \1 @5 W+ MlistenerObject.click = Delegate.create(this, clickHandler);
) P. V+ E6 c* d' ?function clickHandler(evt:Object)8 K- S; D2 P% o1 F5 y3 c2 c1 G3 F
{
7 Z7 j6 _2 Y* z" h1 G7 d6 {/ ?    trace(this); //输出: _level0
9 e, l6 [4 d4 P}" k2 M* W) a! d8 n6 m+ r$ O5 S* g
broadcasterObject.addEventListener("click", listenerObject);
; o' W2 K& _5 f5 S* c: F使用函数:this 指向 _level09 L1 b7 O; V- s( B
function clickHandler(evt:Object):Void
) U* O( E' X, b, j$ ?; @{
6 Y4 Q; O) X, F9 |    trace(this); //输出: _level0( h# @/ J! R1 o1 j3 ^4 N
}3 i  b2 }: e  o# s: w% N
broadcasterObject.addEventListener("click", Delegate.create(this, clickHandler));; e. W) @- e- Q8 C# S& S
事件对象:1 s) A% [2 Z& b6 c8 p' m& k6 Z
它包含两个基本属性:
# C9 v6 C8 m$ v( @" Ltype:String              事件名.! K$ s; u( F" s- t; _+ c" A
target:Object       事件源.此属性可以不指定,默认为事件源(调用dispatchEvent方法的对象).
5 l- V( x4 d: `$ \) W  W此对象传递给 EventDispatcher 类的 dispatchEvent 方法并作为参数传递到侦听器.  u4 B  D9 Y  r( I6 D5 i/ N" W
例:
& H2 i0 l/ l  R//发送事件.# U8 v* L! B1 H) \% m, y# ?3 F! z$ n
dispatchEvent({type:"click", target:this});. Y2 ~* J% o: l9 h
//事件处理函数.
8 w9 [  i5 B$ r) o% v4 `* Z6 ]function clickHandler(evt:Object):Void8 u7 ?* ]) J( V- N# J: t4 }' ?
{
4 J, ]+ `) N) A" i) X" ]$ ]    trace([evt.type, evt.target]);  
* c" ?( A: t2 ~3 f}
$ M9 P! P0 z8 o, l6 t+ _' S  \//添加事件侦听器., `( U7 n$ z9 j* R' L
addEventListener("click", clickHandler);% e' X  W8 R& M4 O7 k
下一节讲:[2.创建类库]& W1 j  k: Q/ U( g
在开始下面的教程之前.先要创建类库.在硬盘中创建如图结构的文件目录:
% R4 }4 ~& K8 |# l% R( Q
$ X$ D& w8 W4 J' g  c! g


8 d1 a, _0 h  c8 x& O: x/ dClasses 目录是用来存放类文档.
+ |+ Z* b- N( N& w* e8 S8 s" V* J$ IExample 目录是用来存放示例文档.
' g: K/ g7 e1 t, l5 `4 d& x* g创建好后还需要在 Flash 中添加类路径:4 Y. n* F* X" t# F# W* i
Flash 8: 编辑-->首选参数-->ActionScript-->ActionScript 2.0 设置-->添加(+)-->浏览到 Flash Class Library/Classes 目录.
/ u# T' M  b7 Z
- m9 S3 n% @( ~  TFlash CS3: Edit-->Preferences-->ActionScript-->ActionScript 2.0 Settings-->Add New Path(+)-->Browse To Flash Class Library/Classes 目录.- {( O$ ^% L+ L2 K" v
ActionScript 3.0 也要添加(在后续文章中会用到).
: F6 I& C% a7 J0 J7 x5 Y2 I9 }9 E0 I. f
下一节讲: [3.使用 回调函数]
) \# S- q# J% r6 G$ L; }[3.使用 回调函数]
# K( s/ P* J2 S. K( ^% ^! R回调函数也可以说是匿名函数,先看下面的代码:! s3 X2 O. E; m
var myXML:XML = new XML();* Z* T4 e0 A% J- L
myXML.load("xml.xml");
* t3 A7 R8 F- W  umyXML.onLoad = function(success:Boolean)! z4 q, k- r. e0 M3 r* k
{
5 g: z; G% d* ]7 ]/ }    trace(success);
  K  i% s! C( g+ b1 _}$ F& w2 G2 q3 j# W  }' d
XML.onLoad 是一个回调函数.将匿名函数与特定的事件关联,以创建回调函数.函数将在特定事件发生后调用回调函数.
+ m% E, a( O% ]: @. |在自定义类中怎么做呢?看下面的示例.& [8 j: h. @4 p
[3.1.示例: CFEventClass 类(简单的示例)]# R( M) l% B3 _( N0 b4 R& R
此示例文档详细:, R2 s0 A$ O6 p. n9 F+ S) u4 P
Example/AS2/events/CFEvent/CFEventClass.as                            $ i* H/ e, A7 r. j
Example/AS2/events/CFEvent/CFEventExample.as                     
) F5 o( v/ j5 K1 ZExample/AS2/events/CFEvent/CFEventExample.xml                     % M( h% e0 L5 @% g. G7 S: ]. }
Example/AS2/events/CFEvent/CFEventExample.fla                     
' ]* H" k3 Q+ Z0 x4 D# |主类:3 y, P# e) W( x5 i+ T" |+ k5 y0 O
打开 CFEventClass.as  文档,输入下面的代码:
. i. H, P, F0 {; e5 |import mx.utils.Delegate;, J: t8 p4 G0 O" O
//----------------------------------------' n) q( o; R* s7 [) a% ?
class CFEventClass, l! W9 w4 {  `3 G% E( e( ]
{
+ J7 A% [' b: S0 ^: I    //----------------------------------------
1 V. T) m3 B! n    public var tXML:XML;
+ s  a' J9 z; m- T    //定义事件函数.% A) ~, x% r- e( d  H* W
    public var complete:Function;
3 G# ]$ K: k) n    //----------------------------------------+ ?/ H6 Z1 N  \8 s
    public function CFEventClass(url:String)
0 R) Y- b0 n; ?. H3 g    {
: `+ P) d& Q! [6 X; H6 W        this.tXML = new XML();
3 i: `8 Q3 v8 Z        this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);, S% j' Q$ @# \' Y
        this.tXML.load(url);2 ]/ |1 }& j+ [8 e
    }3 u9 m! r/ O, Y/ q7 U- B; L5 w
    private function XMLonLoad(success:Boolean):Void5 f5 ^0 z/ ?! K$ v$ l( H
    {" s! |3 _* R2 ^5 t3 ?6 G
        if (success) {! c/ `& o; j) Y8 F
            //执行事件函数.
+ M- D/ c+ ]$ r0 a# u, q0 I/ N/ t2 g" \            this.complete();3 N+ F7 F  X9 C
        }' P# ?2 {- C! F: j6 G4 q5 p5 @
    }
& m3 _* Z: C( k0 S9 y  j, i, Z3 a    //----------------------------------------# ]- e8 g5 @- a9 a/ T
}4 I4 ^- I: v4 j9 o6 N( l: e1 A
保存文档,这样我们就创建了一个名为 CFEventClass 的类,拥有一个事件,一个属性,此事件在 XML 文档成功加载后发生.
0 @2 g* v" a, p. z0 B# S示例类:9 R& s" Q! Z6 r+ b5 }" `0 `4 [1 A
打开 CFEventExample.as 文档,输入下面的代码:8 e- T% x" C" L' g# r
import CFEventClass;
4 J$ |0 K- l# e% A9 G//----------------------------------------
2 N0 G& J2 i& |* M7 Z2 T8 \class CFEventExample
# a+ E; t6 ~, ~8 O. ^{
0 W6 L6 T# C+ r4 N- }7 b    public function CFEventExample()5 o7 q: [' `3 G3 Y# R  |
    {
0 B7 u4 v3 n/ `5 a+ W8 L6 `        var ee:CFEventClass = new CFEventClass("CFEventExample.xml");( Q# k* n3 i. G2 L+ _
        ee.complete = this.complete;/ x  H8 n( q7 w+ {+ n2 e
    }% K# Z% D. z; Z3 ~* U# r: o  J
    private function complete():Void
& a- r3 F- u- B& |2 r1 v1 v    {5 E( F/ q) v9 f9 l9 w4 u
        trace("complete");
7 n- I: @% T; k& R: W, z    }
" ]1 S/ {" s4 D$ @; F}
1 F/ N3 p5 ~; ]% B; o: `保存文档., F1 m4 q5 i0 U/ P3 W* }+ G2 V
在示例类中我们创建主类的一个实例.来加载 CFEventExample.xml 文档.然后使用自定义函数与 complete 事件关联.( I$ x" H" U" G' H
如果要移除事件,请使用下面的方法:
  N9 V* f5 g: o8 k1 Mee.complete = undefined4 q1 X9 m7 w! M- A: K
//或6 P! I' N& u& D
ee.complete = null;1 J7 l$ ~0 I  s- v. b
//或1 ^( z( q- X4 L7 }: a4 X
delete ee.complete;
5 I( R) h2 Q: K+ s1 W2 a要加载的 XML 文档:
0 D/ v" N( l$ Q2 b+ G4 f打开 CFEventExample.xml 文档,随便输入一些内容便可.测试用.9 i5 I3 m2 @  F
示例 fla 文档:% S# ^. I8 N% H+ c
打开 CFEventExample.fla 文档.将"图层 1"重命名为  Actions.并在第一帧中输入下面的代码:6 v5 u6 @* c+ y+ I) B# B' R: g) g
new CFEventExample();
$ ^0 x4 y6 g% J
! F1 J) D: E( j( ?. Y保存文档.
, W" |6 o; h9 w% v测试 Flash 文档.在 XML 文档成功加载后会在输出面板中显示以下内容( G4 \( K( F% g2 v6 t
complete
2 N5 a) ?8 `; Z% h; v* {如需给事件传递参数,在执行事件函数时如下添加参数:$ T$ H, E  E, p9 T" U
this.complete(参数1, 参数2, 参数N);0 e) {$ R  b8 M' I
在调用事件时:2 G) C8 N$ S9 M$ y" n/ [) |: j3 {
private function complete(参数1, 参数2, 参数N)
4 X, Y7 ~2 n* Q6 g{) y' a7 h- |" N. Q
    trace([参数1, 参数2, 参数N]);. g1 ~7 f5 {5 Z
}
% y* U3 z* g' j+ X; l, K下面再看一个示例:
# X$ y0 H1 G# l. B6 T& a/ b7 q+ ][3.2.示例: CFTimer 类(定时器)]
& M& c7 x  n; G# S6 L0 P此示例文档详细:
! z- A* M+ G+ W' P; T+ v% MClasses/AS2/utils/CFTimer.as
/ {7 e4 n( m7 a4 s" ^6 H: TExample/AS2/utils/CFTimer/CFTimerExample.as; }" [6 I& _& N1 e4 o7 g9 x2 p
Example/AS2/utils/CFTimer/CFTimerExample.fla) x. J- |! _8 r$ g
主类:1 Z" f0 v2 G- ?$ w: n! A; w
打开 CFTimer.as 文档,输入下面的代码:
. p( j$ Q. U& kimport mx.utils.Delegate;
& L; o) \; W( ^3 t//----------------------------------------( r3 a; a4 \  t7 Z6 F
class AS2.utils.CFTimer
, C0 P/ t, @! q& n( t% m{
$ |- \5 f6 t8 v    //----------------------------------------& c# O, P- ?2 {. U7 P
    private var _timerID:Number;
9 I8 F2 T& k. ^- c    private var _delay:Number;
* d' t* e( H+ w    private var _repeatCount:Number;
/ z8 N" M1 n3 K1 t! Q, X! x    private var _currentCount:Number = 0;1 |) P5 b4 c9 l
    private var _running:Boolean;! [0 t  D; w$ `6 H! `- H/ [
    //----------------------------------------. A, U1 t* y4 [0 P7 b
    public var timer:Function;; _/ k$ n1 c' v3 u- [5 X' V
    public var timerComplete:Function;
3 G: |$ H0 b# y, y& w    //----------------------------------------7 \6 W1 h1 P+ I% }# B
    /*
& y4 p7 |* {4 `( Z4 P2 g& T- A; H5 H    @parameter    delay:            延迟,单位毫秒.( [7 [  y+ E. r+ L$ h* q# e
    @parameter    repeatCount:    重复的次数.默认为Infinity(正无穷大);. c7 y* I$ b1 u7 t7 @5 ^
    */( ?0 t( Y. d& V# n. K2 S8 e
    public function CFTimer(delay:Number, repeatCount:Number)
( j1 K' s7 ?* W    {
. g5 P- [* R) E1 Z8 p/ I3 b- f' Q        if (isNaN(delay)) {
% l! r& R4 }' n3 ^, G; L% l0 B. z            return;
# h( ?( v0 d& [        }
+ l" V+ i. ]) Y! C        if (isNaN(repeatCount)) {
, \6 A- s& f( R' ]4 n0 O* P            repeatCount = Infinity;" [( z2 b) ]& E6 X
        }3 L; i* Z+ H% q( P
        this._delay = delay;
# _4 f! r  T: N, F. f' @        this._repeatCount = repeatCount;
) r2 p* s9 }/ p5 z  l8 e; L    }+ A. n  G: B, c/ m5 T2 }* t
    //----------------------------------------8 I" i' D+ d% X0 {! s' F  b# j
    public function reset():Void
/ g3 Q& E& o+ C) F% |3 x    {: c& t! p2 I' y+ {0 X' C
        this._currentCount = 0;
8 M* G7 t! `8 ~/ d0 L8 T        this.stop();
) o/ |' t# Q9 q" u' ]2 p! H    }
3 L& A+ f! `- E- Z    public function start():Void9 O- V2 h- y% G  R' O
    {4 q$ d; y" Y; u5 G
        this._timerID = setInterval(CFDelegate.create(this, this.startTimer), this._delay);! M: _$ E9 _$ B6 O
        this._running = true;! a0 Z8 I, b9 S2 J
    }1 t0 q$ s7 ?4 K6 T  |- U4 F* [# H, ]4 `
    public function stop():Void; q( j/ p: @- P/ D
    {4 a, I2 H8 c# l* H; ~3 |
        clearInterval(this._timerID);( F, a% K: }' J5 l" W2 F
        this._running = false;
: ?( I" \& W) T4 ]    }. |6 i! N0 l/ m' v. f* f
    public function toString():String. ]. c2 j3 k$ {: Y8 p
    {  I! {% _2 ~, f2 e9 ~7 t: o5 f
        return "[CFTimer]";% g5 R! z* G, J
    }7 R! K, |$ S, ^$ s( e
    //----------------------------------------5 e, M; [& q/ ^5 I
    private function startTimer():Void
! x+ U: |1 ?$ o0 p" t    {; R+ a5 k' r" n( Q, N! {
        this._currentCount++;
$ T" H+ e% @) O( C* e        this.timer(this._currentCount);' p& C6 t+ n- N
        if (this._currentCount == this._repeatCount) {
9 h8 A% p* n2 v8 B$ f            this.reset();
! [/ w! |  i: y  G6 ^0 y            this.timerComplete();; n6 _  y: s) |% D
        }
1 j9 e7 c) i; o2 h/ ^, q    }5 K9 S6 m" n4 Q3 x$ R' q& g4 M
    //----------------------------------------! O8 t# G  m/ R  Z; f: C8 ^
    public function get delay():Number
9 m# v  ^+ c3 s  \% ]9 j: G2 l3 X: b    {
. G/ L( V% {7 j" G+ z( ~1 s& h        return this._delay;
' [( v3 d  u" K' G1 p( {- o    }7 Y! \& I/ E+ a! V5 w& j8 y
    public function set delay(d:Number):Void8 x! g1 R- p5 {- Y' z* z1 l) i
    {
# b6 j' N) b; G0 E        this._delay = d;
: E- g. J4 e  `. P. f+ y0 I) u1 t    }
0 t6 |3 _' a5 G* O; ?5 t    public function get repeatCount():Number
9 X: ^' Y( ^% [% j  H( x    {
' z$ V" a& `/ b" N8 Y        return this._repeatCount;8 H! F- v/ v' j3 g6 e
    }# b2 ]8 v" i- ~- M$ a. L
    public function set repeatCount(r:Number):Void
6 T9 t- h0 s+ e( ^    {' u# d1 F) w) O' ?( O
        this._repeatCount = r;
# C7 |/ y' t1 c) E. Y    }
9 D( U6 T: X9 x    public function get currentCount():Number0 ?7 N3 n( J( s4 z
    {
& a1 D! T' [9 P6 C        return this._currentCount;; f7 \; q8 a" Y( p0 X; F
    }. ~! G5 X/ I, n- r' I- R  [
    public function get running():Boolean! s* s1 V+ v/ ~: m2 H( y, W
    {
5 `8 L7 h, E- i        return this._running;& e1 G* l8 E, ~5 J3 h2 t. o
    }' w) r/ Y# x& o$ R
    //----------------------------------------
* I9 q2 y% l* k- k0 t}2 z! Z9 i6 t) Z# A% O
保存文档.; \4 w4 R0 {9 |4 S4 s
此类的详细信息:3 i$ V0 R6 L2 O" m1 ~- w
构造函数: * Y  k8 S" ^% W; e: ~2 ]
public CFTimer(delay:Number, repeatCount:Number)  c; Y; l2 a# n' I, Z& d+ s, u
参数:
& m$ u. L! E: X2 G6 ^  bdelay:Number              ---延迟,单位毫秒.
  p. q# a" D9 {repeatCount:Number       ---重复次数.默认为 Infinity(正无穷大);
7 o" o* `8 O  }8 f9 B! I4 s3 k! V4 ^方法:
/ t; b9 G! s7 t, d  g1 opublic reset():Void                     ---停止定时.并复位 currentCount .2 ^3 H/ W. v0 k
public start():Void                     ---开始计时.1 ?. Z7 x3 i% \( O3 l! {
public stop():Void                     ---停止定时.
& l7 p  }8 U3 [8 T2 p2 r. Mpublic toString():String       ---返回类名称"[CFTimer]".; z# \3 I; g* L) i, w# k: N, V6 @
属性:$ ^! {' K0 P5 U  L% m
public delay:Number                                   ---延迟,单位毫秒.
8 o3 v9 U3 X; a) P7 u+ j# N& fpublic repeatCount:Number                      ---重复的次数.默认值为 Infinity(正无穷大);
5 W8 h3 F8 x+ C3 c1 Z5 Jpublic currentCount:Number [只读]       ---当前的次数.当开始计时,此值会递增,直到等于 repeatCount.
# g. x% q: a: O9 hpublic running:Boolean           [只读]       ---定时器目前的状态,true 表示正在运行, false 表示已停止.
; T6 q+ I. c$ o事件:# H3 R2 W5 l( t' @- l' j! U$ {
timer = function(currentCount:Number){}              ---每当时间间隔到达 delay 时调用.
$ `9 b, f9 k$ ^2 ~. B- _timerComplete = function(){}                            ---当 currentCount 等于 repeatCount 时调用.
. {) Q  F" x5 w  f9 j' l: Q示例类:! {) b/ ^; K/ l( l8 o5 I
打开 CFTimerExample.as 文档.输入下面的代码:" I, Q, G2 m! g# c+ B) L: t6 t
import AS2.utils.CFTimer;! \+ p5 s+ F! U+ \
//----------------------------------------* G& }* n* V; X
class CFTimerExample+ l! J4 z: H) w+ ?* g
{& Y7 Q- P* U) T
    //----------------------------------------5 {7 d- A3 T. U
    public function CFTimerExample()) {3 P6 \3 s+ r1 _# S
    {+ c% I+ I1 N3 Z: w& a; O
        var te:CFTimer = new CFTimer(1000, 5);+ B0 C7 ]# t0 G; }4 K* m
        te.timer = this.timer;
% v0 V' N0 k- _# r8 Z$ E        te.timerComplete = this.timerComplete;* T( X7 h' o- J( O4 R
        te.start();+ u7 r1 }6 N  M6 Y2 \+ f
    }
, w+ v; y4 B1 @: c1 e8 m5 s    private function timer(currentCount:Number):Void8 F9 `7 }2 `, {8 M# z* j% O! ~0 ~
    {
( A/ M, s2 i6 V! A3 j' G6 _; m" r& F        trace("timer: " + currentCount);. n. p  N0 w7 [- f, K
    }
3 ~2 H' J7 N* }- P! f3 X5 c1 [    private function timerComplete():Void3 d5 b2 d. d# O0 U& D0 y# \5 X7 {2 a5 c
    {1 X" K; G: _. X4 B5 f/ s( u1 o
        trace("timerComplete: ");" a1 ?# ?+ |0 }# @2 p
    }2 R9 [' t4 C" O+ n1 m
    //----------------------------------------
3 h7 t# v# Y9 p; Z. d% S- _}- R& B# t! b7 m$ i, J( S. s
保存文档.# `' A9 e& P5 m! |  @
这里我们创建 CFTimer 类的一个实例, 时间间隔为 1000 毫秒,重复执行 5 次.然后实现 timer 和 timerComplete 事件.
( R& H- f. y- H  y/ E示例 fla 文档:
0 @1 s) J2 P' p3 n打开 CFTimerExample.fla 文档,将"图层 1" 重命名为 Actions.并在第一帧中输入下面的代码:
& g' e$ Q$ ]9 ^  P+ [# {new CFTimerExample();7 K/ }% F+ K" q$ d
/ d3 O# Q1 o$ h$ j
测试 Flash 文档.输出面板会陆续显示以下的内容:' |9 H* q2 ~6 v% `7 {; K2 L
timer: 1
( _: j. q% o: W6 J3 {timer: 2
! A: p2 E; u2 ~7 M0 M7 ntimer: 3
0 W0 q% o' N. k2 j  wtimer: 4$ N( x( g: f& X) @% K( [/ t- l  T
timer: 5
. F+ n: A6 U% [1 ^' a+ n. Z6 NtimerComplete:
0 Q0 S5 y$ e! Q# O0 o( I& x: k* u0 K下一节讲: [4.使用 addListener 方法(AsBroadcaster / BroadcasterMX 类)]
5 P& f/ o- l% P3 ]( K5 p[4.使用 addListener 方法(AsBroadcaster / BroadcasterMX 类)]2 H2 h% D" L7 {% @
在 MovieClipLoader 和 Tween 等类中都用到了 addListener 方法来注册侦听.
9 D  r2 }6 V/ X# c# L* j# X我们该怎么用呢? Macromedia 为我们提供了如下二个类:& i4 p+ i/ d0 ~" a
AsBroadcaster 属于系统类., t& B) E7 a8 F6 z9 |$ A
BroadcasterMX 属于自定义类.类路径: mx.transitions.BroadcasterMX
1 e$ x* C% u. \; z  N6 |这两个类的很相似.它们都是提供事件通知和侦听器管理功能.
* |& n  j) @0 T" N但 AsBroadcaster 类是系统内置的.执行效率会比 BroadcasterMX 类快很多.所以这里我们就用 AsBroadcaster3 s$ r7 z2 N6 |7 L4 u$ Y' |
类来讲解. ; U/ h5 a/ r* D# g' Y
此类详细:* y  W" x( D2 t4 ]9 [: a( T
public addListener(listenerObj:Object):Boolean         ---注册侦听器.3 Y0 p. a8 Y  t8 B( G# Y3 i
public broadcastMessage(eventName:String):Void         ---广播消息/发送事件.
' _) A, X& d- h4 L! J$ `public static initialize(obj:Object):Void                ---将事件通知和侦听器管理功能添加到给指定的对象1 H  i4 }# n  `# }' u# e! F. g( n
public removeListener(listenerObj:Object):Boolean ---移除侦听器.6 X& Q  @1 _# V0 U" D1 Q1 t
public _listeners:Array [只读]                                     ---对已注册侦听器对象的引用.' ]) b& @# s% Z/ Q1 D
该怎么用呢? 看下面的示例:
8 x& s* J8 s- J5 \4 P' g- S+ c[4.1.示例: AsBEventClass 类(简单的示例)]
. b" Y  D9 y. c3 D此示例文档详细:
7 Z* Y9 q( {( h% B7 Y2 _; HExample/AS2/events/AsBEvent/AsBEventClass.as6 n7 u+ E0 R6 u+ o& l6 F
Example/AS2/events/AsBEvent/AsBEventExample.as
6 T& e0 }2 g; e& RExample/AS2/events/AsBEvent/AsBEventExample.xml
3 [; d- u+ ?/ p* U# B/ z1 v% FExample/AS2/events/AsBEvent/AsBEventExample.fla
9 }9 {9 A) R7 F0 @主类:( p( s, w( X( }' U
打开 CFEventClass.as  文档,输入下面的代码:
+ _0 V: q+ l9 F8 ~% Rimport mx.utils.Delegate;+ H2 l! g4 c1 J1 F
//----------------------------------------- }0 L/ h. g0 X
class AsBEventClass extends AsBroadcaster5 ]7 l+ F8 G$ t3 q# E- c2 R. W1 d
{
& v0 @% {$ l4 c5 x/ I) }( }    //----------------------------------------- U8 }) ~% @7 I! D, ^4 b
    public var tXML:XML;" f1 N  H) u0 k8 `
    //----------------------------------------! L3 ]3 _2 i/ Z4 F8 z" X
    public function AsBEventClass(url:String)
, C* e+ t1 W- h$ R% r6 K  Q    {
: W, |4 J+ l( N/ u8 o        AsBroadcaster.initialize(AsBEventClass.prototype);5 A& ?4 n7 p8 C1 ]4 V; B& s
        this.tXML = new XML();4 P8 O; Z3 H3 ?* c( n  V6 v, S" c: `  w
        this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);
' y6 E  G. Y* w1 e! [. A        this.tXML.load(url);
. N2 @% b  `; J& z2 r" ]    }
. l: z0 n$ l  }3 ?    private function XMLonLoad(success:Boolean):Void& [5 q  C0 j3 H6 K4 a3 I+ F8 s. }/ e
    {  E& K" A$ u/ z$ K
        if (success) {) W: A& q' y6 y4 b# H4 J7 V+ {8 @
            this.broadcastMessage("complete");
# V+ `! l* b# c' W% H        }7 {( f" _) I  D. |7 V" R8 v; m
    }* [; v  N% J) `* u5 C$ m8 o
    //----------------------------------------
4 b! A7 C; l) e2 c$ [  _}
( _( n; f# W3 G8 ?. x& @保存文档.. A1 h$ S- u, Q. L* _
这里首先继承 AsBroadcaster 类.然后在构造函数中使用$ m0 T0 C, g. t
AsBroadcaster.initialize(AsBEventClass.prototype);
/ w) D: S$ G  V来获取事件通知和侦听器管理功能.最后使用+ ]) @5 y" C- v
this.broadcastMessage("complete");
' F2 C' T( B% k: V. ~' B7 l来广播消息或发送事件.
9 R/ `: n) P9 {! T当然你也可以选择不继承它,但需要在类中添加下面的方法:, E* X" L$ D$ l* d* v6 C
public var addListener:Function;
/ o7 ^0 o( R7 |public var removeListener:Function;
. i! P$ ~; m# P2 j& v0 Sprivate var broadcastMessage:Function;
& D* s% ?2 Y* e- V7 k示例类:
* I' H) O. y! r3 l* d6 J& B, [打开 CFTimerExample.as 文档.输入下面的代码:( ?: G1 L5 D9 s/ `0 ^5 w
import AsBEventClass;8 x1 d9 Q( Z, t, x2 C
//----------------------------------------" r) q" B% C+ R2 a  ?8 \1 z" _
class AsBEventExample
1 H5 W" V& ]9 B6 w{
: w, J* d, P8 W- ^& P7 @6 d    public function AsBEventExample()) h5 b' T- J- k: b8 A( J
    {
- y) {  E4 I. v' ^0 k        var ee:AsBEventClass = new AsBEventClass("AsBEventExample.xml");
7 k- m% |% q% j! I7 p2 [, \6 v        ee.addListener(this);( o4 Z5 @9 f  n
    }
! @. t+ v7 @9 D# e6 b2 a    private function complete():Void2 }+ ], o) q: T5 o$ T, V* |9 @
    {  A; W+ W0 U2 k7 q* {
        trace("complete");
% c& p) G/ Y" Z    }$ j' {5 w9 N- n. m/ U2 X, t
}! X$ E8 A8 U' J. g) E
保存文档., y/ E6 K' M7 P/ R+ [- i* A
在示例类中我们创建主类的一个实例.来加载 AsBEventExample.xml 文档.然后添加侦听器.
6 x) I, c0 o$ g" \4 o8 j2 n如果要移除侦听器,请使用下面的方法:
& k# t$ ~' T5 [/ l9 R0 D# qee.removeListener(this);0 U2 b4 O. w+ G; w
要加载的 XML 文档:8 W, @" u" q& A$ i5 ]5 D" E! T3 p
打开 AsBEventExample.xml 文档,随便输入一些内容便可.测试用.+ [0 r8 T+ K: T3 r$ c, z
示例 fla 文档:
/ L/ X/ W! _" T0 r5 r2 ^打开 AsBEventExample.fla 文档.将"图层 1"重命名为  Actions.并在第一帧中输入下面的代码:( J: w8 e) {/ h( B
new AsBEventExample();* k- {  t/ `+ b0 y6 B/ K4 b( s2 }1 ]
保存文档.
; u( S7 H, X* c9 Y9 o$ O- _, b测试 Flash 文档.在 XML 文档成功加载后会在输出面板中显示以下内容& m0 ^6 r: e( t9 d- u
complete
' @! o) N7 S6 g如需给事件传递参数,在发送事件时如下添加参数:
8 C2 k+ i( f4 lthis.broadcastMessage("complete", 参数1, 参数2, 参数N);
+ Y5 g4 o( `' Z在调用事件时:* g1 ?8 N' c8 Z; J
private function complete(参数1, 参数2, 参数N)
2 |$ V0 f4 t2 K2 m) G# U7 s- H{
7 Z  O, Q5 X; S& }4 e    trace([参数1, 参数2, 参数N]);3 D* ~6 S& t2 q& Y* c$ P: Q. m
}0 j; D1 l4 y8 i, J7 K, S8 D
下面再看一个示例:
8 {7 ?5 s: H# J% r3 e; @9 D[4.2.示例: AsBTimer 类(定时器)]. C  L* w  F. s( W
此示例文档详细:
. T0 u4 ?" J% jClasses/AS2/utils/AsBTimer.as
( x" y+ v* J2 v. @$ T2 EExample/AS2/utils/AsBTimer/AsBTimerExample.as; ^# M) I+ ]# R- F  t+ ?% m
Example/AS2/utils/AsBTimer/AsBTimerExample.fla7 E: }2 t: h6 X0 x
主类:$ w# g6 A* }4 O/ L
打开 AsBTimer.as 文档,输入下面的代码:/ `0 ?: G7 W1 i; Z/ W' E. R8 M: N5 T
import AS2.utils.CFDelegate;$ n& I  q& a4 Z6 k. e; P! |
//----------------------------------------& s5 q! G+ t' A5 i. n
class AS2.utils.AsBTimer extends AsBroadcaster* I7 }3 t$ r) z( ?
{4 v: l  a/ p' ]/ P. c' J: f( {
    //----------------------------------------" h& q- r* L# s$ _, L8 J) r7 A7 @
    private var _timerID:Number;
: b6 y2 P) ^' |! k4 K    private var _delay:Number;
) Z$ f  o1 _1 V/ B1 m    private var _repeatCount:Number;& c5 W# x3 V" s# V% g4 a/ ^# S
    private var _currentCount:Number = 0;
2 k* y7 h! y& X1 Z/ ^5 X( T: V    private var _running:Boolean;5 r$ W" V1 `: ?3 |
    //----------------------------------------; c# G5 w! {9 G1 r' V6 J
    /*0 u8 J# p+ Y9 A; q) d. d
    @parameter    delay:            延迟,单位毫秒.
+ ?! c4 x/ i" \4 w    @parameter    repeatCount:    重复次数.默认为Infinity(正无穷大);
" k$ J* ^2 `) k    */1 H& k) I+ K1 M5 p
    public function AsBTimer(delay:Number, repeatCount:Number)
# ^" v) D5 n" T  _    {
4 j' S& Y9 s! v+ q$ Z        AsBroadcaster.initialize(AsBTimer.prototype);
: S: H, r2 L, Y        if (isNaN(delay)) {
/ L# j# E+ u/ A2 G            return;( Y7 a( ^! [! s/ o% U: L% x2 b
        }
6 o- Z$ v* c: x! C. P1 S  i  T        if (isNaN(repeatCount)) {0 P( y7 h2 h; D
            repeatCount = Infinity;  B) o! W. j. _/ r3 {9 _9 C$ w
        }; E: l; ?4 D: C0 `) j
        this._delay = delay;: R0 v: T; t8 {% x0 H4 W
        this._repeatCount = repeatCount;
/ S3 d0 O- f/ c9 T$ _9 c    }
! d+ g) t) a7 j& u, u    //----------------------------------------
9 i6 y" x5 ^# p2 v1 B    public function reset():Void  q  `- x. g: T; c5 d- d
    {! K, V6 k( s% x
        this._currentCount = 0;4 `6 O; x9 _$ z5 }
        this.stop();
2 f: V# Z1 m) J( z7 O: B    }9 \2 C# s, P; s2 ?  F& o% D' `( d
    public function start():Void
# S5 y( j$ m5 c" z1 @' A    {/ u9 |4 t8 l7 ^: Y% B& Z
        this._timerID = setInterval(CFDelegate.create(this, this.startTimer), this._delay);
" y" {/ Q! v$ t. l8 Q        this._running = true;
2 {& t! F" B9 B; m" V    }
( Z% ]$ M! ]2 a' P* |" z    public function stop():Void
+ L( N5 G8 n7 }5 i( W9 T3 a9 R    {
, Q1 _$ x' \' D1 b8 F6 l8 X7 i        clearInterval(this._timerID);  U7 n& A0 q7 O# W, B! ?  \7 L2 l9 b
        this._running = false;
% \& x1 n9 ^' Q  c) `    }
9 F7 U3 v, M. s, q1 K' N/ v# D5 P    public function toString():String6 v& W; j% y) p5 _; @8 @
    {, m0 {9 J" C' k/ B# I
        return "[AsBTimer]";' U$ `1 [5 D  P' O7 S8 l
    }
/ W, k5 |. O' [7 z; D& \    //----------------------------------------
( h& R0 K" a0 R. S& }5 u    private function startTimer():Void6 ?% i  Q- x/ d7 \* W6 S
    {
: y+ f5 E  n- L        this._currentCount++;+ r0 F; H" a4 ^( V
        this.broadcastMessage("timer", this._currentCount);
) U- T* i% `3 K! q& _3 Q        if (this._currentCount == this._repeatCount) {; W6 A$ `* M4 O1 q
            this.reset();
8 {  y3 Z# b# {; R1 [4 B( c            this.broadcastMessage("timerComplete");2 `8 i  f1 @% I
        }
$ }6 w8 m* c4 t3 I0 v    }
) u; E, T* X" E# o    //----------------------------------------+ P' |2 B$ d& Y- G9 f9 O
    public function get delay():Number
  ]$ o. K# U$ C, u    {; G, g* r# t3 A$ ^) q, L
        return this._delay;
7 L% |4 u9 M( d2 i; |$ j    }: ?; y3 A' b+ M  u. Q- m
    public function set delay(d:Number):Void
8 f2 X& `1 p' G' m7 \3 K. w1 S    {
3 p: d+ D. U' V% U4 ]  g7 X        this._delay = d;/ o9 K( P1 F+ {1 |) k& }2 G
    }
+ `( q5 t; C" D% ?% b    public function get repeatCount():Number! l& B( Q! l$ B. b' r  ]
    {" {: L' ~  \8 m7 V) j+ }# y8 W! f
        return this._repeatCount;0 i# c" }. p4 E! P5 ^/ Q* Z* d
    }; e* a( r6 l; Y1 m
    public function set repeatCount(r:Number):Void
# a* m% \& d* n# P) Y) i( W/ Q    {
1 [: S. p2 V$ O: v3 x; o7 s  U        this._repeatCount = r;4 F+ }% x" w1 ~/ t% H$ W- r
    }. W/ x5 Q, A# S5 o
    public function get currentCount():Number
6 V; P' T% B& I, R* d    {; Z( G$ M7 G5 g) o& u0 {
        return this._currentCount;
' z; {. j/ u' c8 k! R    }
4 k/ b! Z' P, o    public function get running():Boolean
9 I* F5 l" G  D1 ?# B. i    {8 Q* g  ]0 S! U1 q
        return this._running;
6 `5 G: m3 e3 B7 \8 f9 _% `    }+ x% t6 a8 f" s' X9 G
    //----------------------------------------' D+ y1 t0 P% p/ O9 T& q9 _8 d
}
  |7 ~! H/ a, J2 G5 r因此类详细前面已讲,功能一样,只是事件处理机制不同而已.这里就不再啰嗦.6 p6 i+ G( K1 k& t
示例类:
& C, c  I( ?, r8 l打开 AsBTimerExample.as 文档.输入下面的代码:
5 C8 \# G% |# t2 a& eimport AS2.utils.AsBTimer;' Y8 y& i3 V+ D) y+ w5 Y/ Q
//----------------------------------------; k* b' G: U/ Y1 f( H  h
class AsBTimerExample1 y, G  e! f/ P7 V0 x) |2 Q2 ]
{' m: j8 D+ D/ [1 v
    //----------------------------------------1 B: N: G. v0 p
    public function AsBTimerExample()/ \1 Z2 H% p- `5 c( \. L
    {$ S) L8 q9 Q8 c0 s) ?
        var te:AsBTimer = new AsBTimer(1000, 5);
, W$ h0 q; ^  X4 v        te.addListener(this);
4 ^" {+ e8 D: L8 X# ~        te.start();
% Z% P3 U+ q  [    }
. v# o: q# r4 Q" T    private function timer(currentCount:Number):Void
/ p7 u0 o8 Z6 |  m: E& f5 Z( Y    {
/ [" C8 P+ x1 s        trace("timer: " + currentCount);4 u1 T7 I# J9 i. Z
    }1 v( w3 H! A' [! n) O) R% l
    private function timerComplete():Void' J* u" Y3 N8 D/ l
    {- f( W% G, B+ \1 v3 `$ T
        trace("timerComplete: ");  Q/ P2 ]' P/ p) ]) B" ~- H9 }6 Q6 [
    }
, L' W3 S2 b7 j9 R    //----------------------------------------7 R9 d( n3 C* X2 c% h) e0 a7 K+ ?9 i
}7 k9 R; w& d$ v; p; @
保存文档.
9 T  d& o9 x6 z. I& |2 w& X示例 fla 文档:+ n5 N' n5 @- \8 l9 k2 S
打开 AsBTimerExample.fla 文档,将"图层 1" 重命名为 Actions.并在第一帧中输入下面的代码:
1 C; M# H6 N& x1 J4 Tnew AsBTimerExample();
- T8 Y0 e- X3 c: g4 V( b8 r8 j2 u测试 Flash 文档.输出面板会陆续显示以下的内容:
- T4 D& l( \5 `* Dtimer: 1
: W* \4 p! g, p4 O! Y3 X6 S1 etimer: 2
+ [7 b0 d( i' i. Ztimer: 3
% a7 O. v" Y' N" P/ Q+ T! atimer: 4
2 Q  Y- W/ d2 J# O* Dtimer: 5
, g. M  P6 v: ^% _1 R: ]) t+ `timerComplete:
: r' }( c( g9 ]6 n7 U下一节讲:[5.使用 addEventListener 方法(EventDispatcher 类)]
5 V! d7 ^1 w0 T) o+ m[5.使用 addEventListener 方法(EventDispatcher 类)]* G6 b# F/ O9 f" `. j0 x" K" w
: F% A1 `9 g5 U  \+ v
打瞌睡了吧? 貌似有口水流下来了.呵.本人文字表达能力不是很好(好像是没吃多少书).让大家见笑了.其实学编程3 n/ U! d" }' s/ l
是比较闷的.不只是闷,还有很多很多,但既然选择了,这些就只是学习途中的坎,需要我们跨过去.就像是你选择走哪9 Z4 A" x8 h5 C& N  k$ Y
条路一样,既然选择了,就必需是要走的.但这路不只是你一个人走,人多了就会有竞争,我们不能总走在别人后面.所
/ Y1 G8 Y' T- Q  @以需要加快脚步走在前面,让后面的人去追.但有时也会在不知不觉中走弯路,我一样也会,所以在本文中如果你看到
0 M& }5 o6 v8 d! e9 u有不正确的,希望你能指正,谢谢.此文的目的是想让大家在这条路上能走快点.你很啰嗦呀....呵.题外话就说到这.3 @$ x9 V8 [7 J& P5 @1 k; [
下面继续.
  a3 W5 S7 z$ S& y$ q这一节讲 EventDispatcher 类.此类也是提供事件通知和侦听器管理功能的,但比前面讲的功能会强一些.在 AS2
! \- Q8 L3 N9 l: i* e! t7 J- ]; ]6 Y中,此类用于组件的事件处理机制中.因 Macromedia 没有过多的讲解此类.很少人将它用于自定义类中.本人在研究& V1 ^* h# A8 }4 y8 x) y
mx包下的类时才知道此类的用法./ f( I9 D; ]& j' i; {; r
首先看看在组件中如何使用:
- `7 e4 E* M. R7 U" @1.
: S# I" m: h7 N% ffunction clickHandler(evt:Object):Void
/ O( ?/ z" ~1 \" w$ C5 E/ P* z{3 G$ V3 d# J, k
    trace("click");
* U& b$ _! Z% c! Z& j& f% Q& S]9 q* `  `5 o" F
button.addEventListener("click", clickHandler);8 W% l7 R& X9 K
2.
) l8 {' U8 U0 S( h% _$ ~' ]" L: tfunction click(evt:Object):Void
8 b  I8 A" a0 P& \' m" t& ?{
6 M4 d: {) [/ ?$ [# G: E    trace("click");8 n2 i0 F% \/ Y; n' c, B4 M: ]
]
$ G% C5 a5 G1 x! B+ C2 W) i% Ibutton.addEventListener("click", this);
9 h! L/ T$ J4 Q) G3.0 Y: H" D3 b. X" d" p6 f& B
function handleEvent(evt:Object):Void
$ x) ]  ^8 L  J1 m{
! B% F9 ?+ X- S6 \' k. O5 d2 x    trace("click");# b6 I/ P; _+ l9 p% n9 Y  _
]
3 {; `9 V4 e- E. ^button.addEventListener("click", this);% u7 v* d9 t. ]$ o2 t; o' e* i3 k
4.3 Q: X* ?3 F$ b2 X# {7 B  x+ Z5 a
button.clickHandler = function(evt:Object)
) W4 Z+ h6 r0 `1 J7 [, D5 c# F+ T! E{
# d5 V, P- \' Y: k; H    trace("click");
- z% M. w" O3 k4 p- R}) j( }8 f+ c0 V0 B  h4 Z' Z
这几种写法其效果都是一样的.都是侦听 button 实例的 click 事件.
2 e4 K' M* y5 ]9 v" Y$ z; Q下面来了解此类详细:; ~0 F" Q2 T5 D* ?+ R, Q* S% B' F
public addEventListener(eventName:String, 侦听器对象或函数):Void              ---添加事件侦听器# D0 B  `3 \0 ^4 l. a
public removeEventListener(eventName:String, 侦听器对象或函数):Void              ---移除事件侦听器
9 b3 r+ g1 J$ B. Npublic dispatchEvent(eventObj:Object):Void          object:Object):Void 帮助文档中没有讲解 initialize 方法.此方法的功能同 AsBroadcaster 类的 initialize 方法一样.7 a+ h) w" ?& V& d
该怎么用呢? 看下面的示例:) G' \7 @1 t$ @/ _5 I9 K  _
[5.1.示例: EDEventClass 类(简单的示例)]
/ |% v' I- R3 ^5 K) p' U2 |" S" ]此示例文档详细:1 r" P4 ~0 m' w/ s" Q( ~+ c
Example/AS2/events/EDEvent/EDEventClass.as
" R+ ~: j* L# p2 NExample/AS2/events/EDEvent/EDEventExample.as
$ ^6 D* x" t2 u" F/ Q# WExample/AS2/events/EDEvent/EDEventExample.xml8 u2 R2 F! b, ], @, |- k  \, G' _0 |
Example/AS2/events/EDEvent/EDEventExample.fla! o( Q! Y' O( o- g- v2 u% s9 Z& a
主类:
9 @3 |# Z) g0 g8 Z1 p打开 EDEventClass.as 文档,输入下面的代码:$ N7 v8 E' P3 v6 F) N
import mx.utils.Delegate;
9 b5 n7 {6 {/ N( C' Gimport mx.events.EventDispatcher;1 p& m, E' q& N5 e! f
//----------------------------------------7 t* ^% ]7 k' O3 |* W
class EDEventClass extends EventDispatcher
" r% L! M  E4 l) @) @9 \7 k{3 Z8 l: K# D) A. ~3 ~7 H0 X
    //----------------------------------------" w: g# H  \4 z2 u
    public var tXML:XML;5 f6 F9 ]# \8 F. ~6 ?: e
    //----------------------------------------
8 L) u0 [: r+ X# C5 K! v    public function EDEventClass(url:String)! t+ Y' E8 X) L- h
    {
; p7 L( n* z8 U* @        this.tXML = new XML();
9 T' }/ b+ }  C3 k( ]        this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);
$ |! \6 {& N$ ~" O: `5 _' p' H        this.tXML.load(url);
0 P! S' B3 N9 ?7 F8 D4 }- c    }
( N- q: R5 }, j4 }+ ]7 M    private function XMLonLoad(success:Boolean):Void
! @; E& c: b% a' }7 w/ D    {
: ]: w1 ]) T5 @, r        if (success) {
+ }7 A) A0 n' x% V, k            this.dispatchEvent({type:"complete"});: c2 E6 a/ Q: v& `
        }" [9 y4 _) x6 c: c( G6 q& n, M% I
    }
& \8 b' D* Y) P( }3 a; B9 E    //----------------------------------------
: P& ^, M: c1 r! {4 C}
& K# A& c; o6 A/ R* B6 h8 a# j. N如果不继承 EventDispatcher 类.请将代码改成如下:
1 I3 U- F+ _$ u0 Fimport mx.utils.Delegate;3 W1 i( x) l3 u( X
import mx.events.EventDispatcher;
& P/ C1 T" H8 K6 L! L- |//----------------------------------------
9 e. Y1 q2 @% A8 n1 Q! hclass EDEventClass & v; l$ l9 [; n
{
$ }3 j% n8 e( B9 J- V    //----------------------------------------. r3 {( v  A* C  R/ }
    //不继承需添加这三个方法.9 [4 o% h9 @( _: D
    public var addEventListener:Function;% {* C" k! T1 u  l7 C
    public var removeEventListener:Function;! N& K% ~1 @6 k6 I4 V3 O- J
    private var dispatchEvent:Function;
# i9 }. R3 P. n# A# y    //----------------------------------------7 ^" ?1 C  H& S
    public var tXML:XML;
7 i  Y1 u0 A6 f    //----------------------------------------" g2 s6 T1 f( P  H) u
    public function EDEventClass(url:String)
, R. a- T+ }, @5 C9 m( Y  |    {
( s+ v1 C4 J1 f+ v* h        //还有使用 initialize 静态方法.1 I$ w$ w% O  F9 r9 |( u
        EventDispatcher.initialize(this);
- M% l" N: u$ r0 M' W- ?        this.tXML = new XML();
+ @: h# b* P0 G8 x        this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);$ i9 h  v1 f  v, N' {- B
        this.tXML.load(url);# v# K7 Q& [; C0 Z; U
    }2 A' E; B5 [% x. t7 A1 ^
    private function XMLonLoad(success:Boolean):Void3 ]% N' t* f1 b" n0 Q
    {6 {8 c( V; W) Y0 ~; F
        if (success) {
( i# Y5 w0 Y0 f. G            this.dispatchEvent({type:"complete"});
' J3 j" z3 E6 e! X        }
1 C3 a1 W& u0 ]) }9 f. v' u# q    }3 @0 r; j3 i9 P! d
    //----------------------------------------" X9 ^0 D% @4 r# Z9 B0 s- e; q5 G3 e
}/ z( v$ |. j" m1 K
保存文档., o0 n2 \2 X5 s; ^" A2 w) n2 [
这里首导入 EventDispatcher 类,你可以选择继承或不继承此类.上面的代码一个是继承,一个是不继承.区别5 }% {% i: e* {4 R+ ?0 a
也很容易看出来.这里就不讲了.7 ^: O2 @- ]" k/ G
示例类:( j' F) e$ j; o8 U. d% C2 D
打开 EDEventExample.as 文档,输入下面的代码:
' E% M1 \0 l  K& E, p' oimport EDEventClass;( \/ H4 x- `4 z! d
//----------------------------------------
8 u: u+ `2 R) z; Tclass EDEventExample
* t, Q2 J6 a% \8 t, e{4 h( P( W; \8 {6 x5 W5 t8 D
    public function EDEventExample()! ]% m& W& b9 G5 i( J5 z/ I3 v
    {& n5 {4 [% a3 H: p: `5 I; P5 V! \
        var ee:EDEventClass = new EDEventClass("EDEventExample.xml");
: ?- N+ O7 @! Y! o+ W6 X; w5 K        ee.addEventListener("complete", this);0 Q5 w) N0 X+ ?) B
    }
. x9 }9 E4 f: K& |/ ]    private function complete(evt:Object):Void
3 I7 S+ k. [+ e9 T1 q9 N. L    {; @( S5 q3 J/ {2 j4 ?8 I
        trace("complete");
7 _% v* g- y) D$ G    }
' Z6 Y8 b! ^: f" m* j, ?}( |( v9 z  M& `* m! c3 ^/ c
保存文档.
/ V% z. A6 e+ m+ i# s1 b在示例类中我们创建主类的一个实例.来加载 EDEventExample.xml 文档.然后添加侦听器." x' _0 E- [( {/ C; Z7 B0 @4 ]
如果要移除事件侦听器,请使用下面的方法:( r2 C" v( o* z0 K9 P# f
ee.removeEventListener("complete", this);
# B7 @0 ~* ]( Q要加载的 XML 文档:( b/ _' N) d+ b
打开 EDEventExample.xml 文档,随便输入一些内容便可.测试用.% x; I. l- O5 l. g
示例 fla 文档:
- o' L9 }+ i: x) l* ~' b7 U% r* g打开 EDEventExample.fla 文档.将"图层 1"重命名为  Actions.并在第一帧中输入下面的代码:7 g( K; Q0 P* ~! J. y" \" J
new EDEventExample();8 Y1 a2 }% i0 q7 S3 c: m6 E
保存文档.
- ^1 A1 b0 {* Q# O/ A- [& z; W测试 Flash 文档.在 XML 文档成功加载后会在输出面板中显示以下内容- K! G; `8 u5 Z) [
complete
, c' s8 G. _6 t( ^如需给事件传递参数,在发送事件时将参数添加事件对象(请看:1.事件处理机制)中,如下添加:
7 ~- h& M6 ]6 ^this.dispatchEvent({type:"complete", 参数1:"参数1", 参数2:"参数2", 参数N:"参数N");/ @; W* @# F; \: [. e; k
在调用事件时:
& V7 I5 U5 }2 }) T* |$ t6 eprivate function complete(evt:Object)4 t% w- o1 p7 v$ |6 x9 N
{
! h6 n0 H- s0 L  Y8 b    trace([evt.type, evt.target, evt.参数1, evt.参数2, evt.参数N]);1 a3 G/ q; ^( j
}
1 @  h3 f9 {. D4 Z下面再看一个示例:
& R7 {5 n6 w# y[5.2.示例: EDTimer 类(定时器)]! r. B4 s4 f) f9 h7 ]. u1 M( O5 i
此示例文档详细:# t* I0 D$ }7 q' ~/ c6 B% @- p
Classes/AS2/utils/EDTimer.as5 e  m: y& L3 y, l4 [
Example/AS2/utils/EDTimer/EDTimerExample.as
4 b6 L- k! e8 H" F6 r# [Example/AS2/utils/EDTimer/EDTimerExample.fla7 g, @9 e7 F8 R- l! b
主类:
  C0 I% U6 a9 o+ b- t- s- E打开 EDTimer.as 类,输入下面的代码(当不急时,应多打代码(有利于巩固知识).不应 copy/paste):7 r. Y5 z/ w/ i. V+ K4 r
import mx.utils.Delegate;
7 C5 b. T+ ]+ P, I: ]import mx.events.EventDispatcher;. `; o. A, @% E+ e& ^# U# s
//------------------------------. l- U; R) J& H+ N$ D
class AS2.utils.EDTimer extends EventDispatcher8 Y* n" s3 {, O; i) g* H( N
{# B1 Y* N' A" R+ w' L6 V3 Z# R3 J
    //------------------------------
* [) W5 h& N8 t) Y4 t) v    private var _timerID:Number;+ N# s7 c9 u, d/ D6 q
    private var _delay:Number;
  Q) @4 q/ y1 e' q2 @3 Y' A    private var _repeatCount:Number;' j5 C& s5 ~5 d' e7 V  M% P7 Y
    private var _currentCount:Number = 0;' O  }1 _) A1 Z. o! Z
    private var _running:Boolean;, p7 b8 _/ W. R  b' d; i
    //------------------------------% Y2 m  M( u5 i, A2 d' Y
    /*
3 i' [! D  X/ Q6 A) `    @parameter    delay:            延迟,单位毫秒.4 P0 Z3 y8 ^3 r) D! I
    @parameter    repeatCount:    重复次数.默认为Infinity(正无穷大);& l( |  N& a3 o' W
    */7 g8 r9 a7 o* f' b5 h1 s
    public function EDTimer(delay:Number, repeatCount:Number)$ f) c3 O$ F4 _* z
    {
: c. I; q0 c0 |2 P: y        if (isNaN(delay)) {  c# `* G* N( Y. q( ]0 q
            return;
) o4 }0 u7 [: Q0 U+ w+ b        }. e( C* `% w+ p) b! B/ `  P* M. M& s
        if (isNaN(repeatCount)) {- c* W% W0 ~) D  J+ Q9 Q: w
            repeatCount = Infinity;, k- a1 A3 V* s% a' {
        }" H0 _6 S0 f5 w# q
        this._delay = delay;' z# v1 G- M! K; s
        this._repeatCount = repeatCount;
2 ?  C0 n: `1 c: F$ V  v7 Y    }$ ^* G, j: b, u8 n
    //------------------------------+ m6 j% r# Z9 @- w4 p. B
    public function reset():Void4 \6 H4 x: F' n2 \# x, Z
    {
* u2 e! u) R: t        this._currentCount = 0;
# c& N/ D. g0 l        this.stop();' n9 [: B$ b- S, D; H& i  \
    }$ \" S4 W4 [- ~3 v$ x8 R, w! b
    public function start():Void
3 R; k5 Z8 p, U( U4 T/ \1 H    {4 Z3 y4 f( @9 q' ^& s. `
        this._timerID = setInterval(Delegate.create(this, this.startTimer), this._delay);0 R4 f" L% s; j% T9 f
        this._running = true;6 e% L/ G# `. W# `( ?1 V
    }8 Q6 N6 r2 y4 A9 t( W: [. g
    public function stop():Void$ G3 n# @  e' M  s3 X; F7 g
    {# b1 n& @) k  W
        clearInterval(this._timerID);
% f2 `% P2 K4 m        this._running = false;" S% Z$ @4 H3 _( ~
    }
' Z) S* C+ A, t* Z& J    public function toString():String
1 r" w) ]/ m8 `    {) z+ e9 ~% T( P1 w1 o
        return "[EDTimer]";% x* v+ {) c' u" A3 `* W" o3 _
    }5 ]" ]5 @5 B7 K5 o( ^
    //----------------------------------------
( V% h4 s( Z0 q9 X    private function startTimer():Void
$ ^6 c. X7 F5 z, N: j    {
9 J$ _/ u. K, V, J; E1 [; X$ f        this._currentCount++;2 U$ b. H& g% x7 ^: F, P* n$ D
        this.dispatchEvent({type:"timer", currentCount:this._currentCount});
' t/ ~" |& G$ {        if (this._currentCount == this._repeatCount) {" S$ x) \- Q. t2 l& P9 `& Y
            this.reset();
  t. Z9 W& ~0 g3 M; c            this.dispatchEvent({type:"timerComplete"});
' y9 R/ N( w1 R6 W" V( n3 q        }
2 v  S, [  ~4 n' k( w) F7 C    }2 `1 {; j; y! [2 j! d8 d
    //------------------------------
7 K( G' G) A  t/ Z. s9 }: a6 w    public function get delay():Number
7 M* E* D7 e$ q/ f: X; G& ?    {, Y9 M( u4 _4 i
        return this._delay;
: a  U0 s) L6 A: W; d3 E1 g8 B    }3 x3 d" T) ~/ B; }- _! V: s. ?
    public function set delay(d:Number):Void
2 ~; Q9 Y- [3 S7 X9 t: k9 z    {% {, W; v8 }5 m$ i. H0 H: G; r
        this._delay = d;; S1 J- Y' t! x
    }1 J* f  ~1 U* _; m% y0 S& K# _( G# M! |
    public function get repeatCount():Number
" X  [, l1 D& V" K: Z7 x( ~) J: O    {) O7 c" Q4 t; D) a  t4 r8 m
        return this._repeatCount;+ J/ b% x& ^- b* l7 v
    }" l2 D1 f% v. W% U$ Z
    public function set repeatCount(r:Number):Void
0 k$ G& k( a+ _5 w0 E" |  q" X4 o6 x    {; x# r- u5 T0 f3 G# {  @
        this._repeatCount = r;
6 u) ?& z3 X7 d0 i    }% e/ D: y/ x3 D! }! m6 l
    public function get currentCount():Number$ E! k+ }7 p4 R8 v0 }# G
    {% _9 L5 t2 ]1 q" e
        return this._currentCount;
+ G( @6 }! f0 [/ a5 \    }
" ^( F5 ]) O7 W: g    public function get running():Boolean) t' Y! [- h  p* p9 c
    {
4 p9 V( Z: c7 u' Y: E6 ]        return this._running;
, |6 w% m8 ~# T* A: e: |    }; E2 i7 E$ q# n: ?+ y: G
    //------------------------------2 D$ K$ H; k1 C: |' N" o
}
8 R, u4 [3 N3 l% M$ z4 F因此类详细前面已讲,功能一样,只是事件处理机制不同而已.这里就不再啰嗦.
' t  |8 t2 {! |. ]! z7 l7 e示例类:
2 s$ s% j; v; M2 y打开 EDTimerExample.as 文档,输入下面的代码:
4 `9 A1 |8 o( }: G8 U) Kimport AS2.utils.EDTimer;4 ~& T0 e1 n0 M( E2 [1 L7 j
//----------------------------------------5 d9 h7 Q4 Z" {8 z! g( C% v
class EDTimerExample9 C9 {1 c4 s) f4 W
{
  Q  m$ B8 D- |- @9 H: |. ~    //----------------------------------------
  X$ `1 T' q% U8 K! k  g    public function EDTimerExample()
0 D; e. r0 B$ {! a    {
2 h& a6 L$ k3 ~; D, a        var te:EDTimer = new EDTimer(1000, 5);) C5 N1 @3 s( z4 T3 H
        te.addEventListener("timer", this);1 `0 ^: K# ?! V6 ^
        te.addEventListener("timerComplete", this);
( }5 [6 G, _7 I) {+ y        te.start();3 Y4 J7 @$ ~4 ~1 R7 M; M$ Q
    }
& I7 ^# h  Q% ?    private function timer(evt:Object):Void1 i0 c9 ?2 Z/ b& J8 G- j: w/ X
    {9 s, A& K, B% H$ F
        trace("timer: " + evt.currentCount);! R$ D6 ~  s% U$ I# O  U
    }& b- f6 g. s3 `
    private function timerComplete(evt:Object):Void/ S+ q, N( k  h! w! Y
    {
$ O: x. S- O7 t& Z* b        trace(evt.type);
7 _) x* T& D$ W, Q  {    }: Q/ U- L' q& h$ D$ P) _* w  J0 B
    //----------------------------------------" S3 s2 q/ X9 Z/ a% T# j) o8 J
}( W8 g8 e- _* t  w* U% P
示例 fla 文档:
* t. R" u$ u4 M$ z9 J打开 EDTimerExample.fla 文档,将"图层 1" 重命名为 Actions.并在第一帧中输入下面的代码:
, D% h7 Y0 n" j) B4 @. p" B7 P- S- enew EDTimerExample();
3 y" H9 J' i. v/ p: L测试 Flash 文档.输出面板会陆续显示以下的内容:
" ~$ X8 a. I  n( D) Btimer: 19 ~; I+ r; J3 I7 J& G
timer: 2
$ r' u: l. M& k5 l. Otimer: 3, D1 t% f$ H/ N
timer: 4" Z! [6 f$ K$ S; K0 \0 k
timer: 55 a* Z: J% J1 V+ l! p
timerComplete
  R. P9 Q' g3 X下一节:[6.建立强大的事件处理机制]  p$ w+ x  P1 H" [) j
[6.建立强大的事件处理机制]
8 T5 x2 Q; W  q# x' F, a这一节讲建立强大的事件处理机制.学完这节,如果有接触过 AS3 的,马上会想到一句:这不就是 AS3 的事件处理机制吗?) p, r' O: Z4 x7 P& {3 m6 C8 f* ]
的确.可以说跟 AS3 的事件处理机制一模一样.但还是有个作用域的问题.这节对想学习 AS3 的事件处理机制会有很大# y! N; t0 F1 {  }( J
帮助.如果你掌握这节中的内容,在 AS3 中就只有语法问题.也就会很快进入状态.毕竟是"水往低处流,人往高处走".对现* w. @$ D; t7 v  W% j
在用 AS2 的,学 AS3 是迟早的问题.不过 AS2 在新版本出来之前还是会很有用的(个人的看法).- r' h5 u  @2 @) L
作用域因为一样,前面也讲过,这里就不在啰嗦.
' N) i1 h0 r6 w3 Q' v  _+ v. n7 y事件对象.这里已经创建一个 Event 类(或其子类)来代替.但功能一样.
: f" l2 p4 x1 X! v, b这节讲的事件处理机制的形态(代码).- n. d) ], o6 j! t; \/ x( O
发送事件:
# t' N& y$ ]/ k1 U9 x) F//继承.
$ b: |/ T8 Q! U& V+ F% f( @import AS2.events.Event;: ]; ^; J5 Y) w% o
import AS2.events.CFEventDispatcher;
  e/ u1 I, r  c) z. \class className extends CFEventDispatcher
2 L5 ~" _3 q, A$ Z{
# I$ Y# b& ]7 x. k    ...
. k( U3 J+ V; w, x% `6 F9 {    this.dispatchEvent(new Event(Event.COMPLETE));& F/ |( P3 q7 J7 F. j  B8 s/ ~
    ...
" U  L& c6 A7 E}" [- R5 |+ \7 h: A8 N
( m# Z. W! n' X, m7 C6 z, G) b9 ?
//不继承.* H2 c* w4 `7 D
import AS2.events.Event;
8 ^! e/ G7 ]! Z, b3 himport AS2.events.CFEventDispatcher;
3 c: u9 N( N/ `7 u1 b, [class className( }9 c4 A3 R, l/ x3 y6 X0 O
{& ?8 b, H+ H2 @" n" C. W2 `8 F$ p
    public var addEventListener:Function;
# T- h3 o" q$ j1 Z- D6 j    public var removeEventListener:Function;
; J, @, ~# N1 i" L$ E8 B- J: i" x    private var dispatchEvent:Function;, l, S9 q0 i+ r4 N
    . e  U# {7 _+ a: C6 T
    public function className()$ B  A7 h" S, j7 {& q
    {
* z  k8 p4 K; m) t5 F0 b        //此方法要在使用 dispatchEvent 方法前被执行.一般放于构造函数中.
) m0 S$ r+ y. X" S9 l        CFEventDispatcher.initialize(this);
0 h3 ~) |) p. E6 z! w, F    }
9 t, h; |$ r  y) G5 w+ T; `3 D   
9 p0 U$ B* g3 x# `* R    ...
5 t  f# U' m  w* h- {    this.dispatchEvent(new Event(Event.COMPLETE));- _; \; R3 a" g$ [6 U
    ...
* r& Y9 D3 h9 b}
% ^* W6 M- k/ A. j侦听事件:
% c2 @, J/ k1 e2 H; u//使用自定义函数./ X$ z# v' E( o4 Q; ]8 b( w
import AS2.events.Event;8 E$ J/ t: Y1 |5 f% H* R( J
import className;
0 v4 T6 O$ E" i...# |2 S- q" W- I# ~9 s" [1 J) W
var cn:className = new className();
% H1 N1 k3 A1 j! ~1 ^% Q! B//自定义函数.. R& a: U# [5 q/ d4 u
function completeHandler(evt:Event):Void; A0 g  B& Q' {6 K0 p' Z- W
{
3 e+ H. ~& Y. d7 N  {    trace(this); //输出: _level0.cn% l! v* ?" t# O9 }
}, d8 h) ]. }2 T& r6 \! e- S
cn.addEventListener(Event.COMPLETE, completeHandler);4 p7 H) N& [% Y: t
...
2 F4 [4 e5 E# l, T/ _* ^8 Y3 y6 @3 h
//使用事件侦听器对象.
' |# [, H! @" o' f, j  nimport AS2.events.Event;; w, K0 _9 S: m& A
import className;
9 X4 h8 o: O. ~5 I1 g1 H2 |...
: W2 Y8 Y4 ~5 `1 o' }var cn:className = new className();# P: V; e% Z+ ]( G( \
//事件同名函数.& n2 I. e4 b7 W, t1 b- x
function complete(evt:Event):Void$ E- z& l5 p# N* ?; h
{
5 _5 Q. V# g$ P" m    trace(this); //输出: this(指向侦听器对象)
# V6 _4 A/ p' E8 l1 x' h}
( H. x+ ~" V2 N, K4 Ycn.addEventListener(Event.COMPLETE, this);
, O6 L7 t' l: G& n  B/ s0 V...! O% z" K1 _7 N
移除侦听:0 G) D  e1 l1 A: l
//使用自定义函数.2 D0 o" M( j2 d8 @! @" E$ e9 z# U% e
...
7 k1 ]  `: [  g5 Q! Ocn.removeEventListener(Event.COMPLETE, completeHandler);# f+ U4 U0 W) E
...
# z% R. D3 ]) Y% k; V
+ [" g8 ?) a6 e( ^5 ]* O0 `8 A3 L2 [, C//使用事件侦听器对象.1 Q: ?  \. Y9 u- H, v
...
% v. ~' O( Y: p" R+ E! \+ qcn.removeEventListener(Event.COMPLETE, this);7 x6 m* \; U0 k* d) y
...0 e0 P% w$ {4 t1 Q. {: e% M
AS2.utils.CFDelegate;  i) F0 T9 S0 \* e! B
AS2.events.Event;
  R9 K% n- F( _( S# cAS2.events.CFEventDispatcher;, Y6 }6 i' X1 J* F/ M4 R
这些是什么?下面讲解:+ t1 x  K6 q  e6 Y. ]8 D8 x
[6.1.创建 CFDelegate 类(修改 Delegate 类)]
" K, L4 k( z  _CFDelegate 类是 Delegate 类的修改版本.简化了代码(一般不用的功能).提高了执行效率.& I& t" b; A  l5 I( _+ x' h
此类文档详细:! x* `5 I6 q/ H+ Z0 f
Classes/AS2/utils/CFDelegate.as
) D* y$ |; a4 e# w- I5 ]主类:
; W$ V8 L% |1 d7 \6 b) I/ y8 C打开 CFDelegate.as 文档.输入下面的代码:! A. J& _+ G$ X0 u6 m" Q% b% g: F: s& b- r
class AS2.utils.CFDelegate+ o$ \0 T- o8 T3 b, C
{- W, F* H3 z1 X5 R5 p, e
    public static function create(scope:Object, method:Function):Function$ R( D5 y4 J1 a# C6 A
    {' c* w% _+ ?. y1 G! N
        var f:Function = function ()( Y4 r3 Y' T. Y3 w) V" ^
        {
% t# _! N" Z1 c& p# O5 ?            method.apply(scope, arguments);
) ~# n  B' O  }& D4 [# ]/ |        };" ~. E: {$ A# v3 i% g
        return f;
: p7 y. i2 S# w1 |) v" C: B    }
: f+ p, |. Q  Q$ q. w+ t! K' I}( V" o7 v. c9 e5 _3 f" w1 R  q& @3 G$ i
保存文档.
) p" _3 e: \& V; v( R4 z4 b) S[6.2.创建 CFEventDispatcher 类(修改 EventDispatcher 类)]4 p8 H$ Z% i) W0 N
CFEventDispatcher 类是 EventDispatcher 类的修改版本.简化了代码(一般不用的功能).提高了执行效率./ x- }, U- k7 x6 W7 y6 L
此类文档详细:% _: f+ Y: @- m7 G) i9 g6 o0 r- r0 b
Classes/AS2/events/CFEventDispatcher.as& z4 c) B+ `! o: m' Y
主类:2 k3 G2 e$ D/ g! M! ?. K5 m0 X
打开 CFEventDispatcher.as 文档.输入下面的代码:- O( u0 H( q5 n
*/
5 W; I, S7 M" e5 F6 E0 r# \//----------------------------------------
! h' s6 ?6 U3 T( {6 e5 A1 w' B9 Xclass AS2.events.CFEventDispatcher
/ u6 W. S4 \$ a+ S7 q& Y7 `{
! e7 Q  R9 [" j0 ~% T( S2 S    //----------------------------------------
5 V# A2 W- m/ g0 c- v0 W    //构造函数# f" o! t+ f2 V: V
    public function CFEventDispatcher(){}
1 `" }, G% D8 q& i0 M    //----------------------------------------5 t9 W1 d; b1 }8 N
    //当不继承此类时,此属性才有效.! Q7 @  @7 @+ U. Q: t- h
    private static var _ed:CFEventDispatcher;
" P4 z4 `- ^8 ?, ~2 [; q& `    //----------------------------------------- @6 A# l/ a. y+ W, n0 _
    private static function _removeEventListener(queue:Object, handler):Void
+ T# J0 V% W8 ~/ T* e) d# D) j    {
% L7 |# j7 T4 G, A; B: @        /*; h- U9 e! ]3 z; l8 I
        这里主要用于删除事件数组中的事件处理器.
$ f/ Y" Y2 w8 {7 A  m$ o% l; e+ |        */( d( ~2 h) x5 c6 F& V
        if (queue != undefined) {& Q; w# ^' }+ U! T2 D, }
            var l:Number = queue.length;. C2 @( N) e/ y* F
            while(l--){
. b" F( f, Q# b% @7 L+ y                if(queue[l] == handler){
( L/ s) m' O4 X* C/ i                    queue.splice(l, 1);/ l- a, Q- h# j2 P9 x
                    return;
: I' @. t5 S& a5 O                }
! Q. N7 [: Q+ I) Y! P" Q  u            }
+ Q" F1 @% a; s; V* v4 H5 j1 _: J        }9 T, h; r( r# }+ j3 z2 ?
    }! N& A+ h1 O) o- ^5 y2 d
    //当不继承此类时.此方法有效.
+ n( I8 D" o; g& W% |/ ^1 S, O; K+ K    public static function initialize(o:Object):Void
4 O1 i% U. s# T5 v8 `( e( @    {# p6 B2 ?% L' ~6 p( H- S2 G- {
        /*  J3 f+ A' t0 w: U- y, v: v
        如果没有继承此类,而是使用 initialize 此方法时, _ed 等于 undefined.然后创建此类的实例.; x) X! s7 S" P, g+ s
        最后将事件通知和侦听器管理功能添加到 initialize 方法中的对象 o.
' X& E5 W0 |( ?4 f: ?        前面所讲的不继承此类时需添加的三个方法,其实是四个.还有 dispatchQueue 方法.但此方法在
" a" p: r- ^: U9 [! c" O        调用 dispatchEvent 方法时就会自动调用.可能有人会问,为什么没有定义就能调用?因为在函数/ h5 l1 s3 X0 Z& _/ {( U; f' P
        中可以操作对象.从而对对象动态添加方法和属性.这里就是用了在函数中操作对象.+ [7 g8 z. q; C
        */4 J; }* q7 I: e) q
        if (_ed == undefined) {' k9 N5 j4 d2 H4 w  I
            _ed = new CFEventDispatcher();
3 [5 F& E9 A! T  a        }
0 U7 E2 G( A* d. k* ^6 q: R$ F" ^        o.addEventListener = _ed.addEventListener;
/ h5 L- v. H& M& n. F        o.removeEventListener = _ed.removeEventListener;$ P! C: a2 ~1 T- m& F3 S' s0 U/ z
        o.dispatchEvent = _ed.dispatchEvent;
2 {3 p: u$ w( d& j" K: b        o.dispatchQueue = _ed.dispatchQueue;% @" k, Q. u0 @2 e' O" ?- ?" I' c
    }
! g6 }. ^1 G; u# v& O* H    //----------------------------------------
# g4 ?9 ]& k3 ]- x$ W" k    private function dispatchQueue(queueObj:Object, eventObj:Object):Void
$ o0 I9 ?( C; ~# C( P- z    {
# U3 j( E9 N1 W- t        /*& f4 j  x& F& N
         这里主要用于判断事件处理器是对象还是函数.
. f5 P5 f. N& [( r5 ~' H' C2 w        */
: Z& Z1 c6 n. q        if (queueObj[eventObj.type] != undefined) {
0 q0 I0 b1 o$ _            for (var i:String in queueObj[eventObj.type]) {
& o6 l) S" l1 G: {3 _: M                var o = queueObj[eventObj.type];
3 y3 V( E# K! P0 m/ j& l                if (typeof (o) == "object" || typeof (o) == "movieclip") {
, N) [- c& D7 Q0 `                    //调用对象中的handleEvent函数.
$ U1 g5 U) u4 ]% B5 k                    //if (o.handleEvent != undefined) {
8 W# W- Y) G0 I+ k$ R8 D% S( ^9 i                        //o.handleEvent(eventObj);4 I* S8 Z# v& q6 `4 m' y; C* K
                    //}* [5 O* }% @; ]/ w; h% @
                    //调用对象中的事件同名函数.  8 o' b) L7 X2 x/ N8 E6 P/ B( s2 j+ D
                    //if (o[eventObj.type] != undefined) {
. ^# s/ i0 p. S- ?                        o[eventObj.type](eventObj);
9 y  b9 e; w3 b$ {6 S' W                    //}
* f6 R( u, W; p, H* \0 V0 |# m5 @                } else {8 r) W9 j& v7 L- _7 ?8 f/ W
                    //调用自定义函数.0 ]! r; e, {+ E: O+ v- Z' I
                    o.apply(queueObj, [eventObj]);5 {) i$ u5 |6 r$ t/ Q6 L
                }/ ]+ r: W: z9 q% c2 R, J2 t
            }9 V4 T+ k% x& |5 S( o
        }! H# g8 Z2 M: V: U2 G( S$ Y4 X1 I
    }* K8 e0 c) E4 y' q; w; E
    public function dispatchEvent(eventObj:Object):Void
2 @- \6 R; c; N3 Y( ]$ g& b. _" q    {
# C" i( g, c8 y. T8 ^        //将事件源始终指向this(应用此类的对象).& S9 O: _  @+ s% p
        eventObj.target = this;
6 ^! p/ i. X$ z4 z- J$ a        //此句对动态类,或在类中定义"事件名Handler" 这样的函数时才有效.在这里我注释了这句.你如果你想用,可以启用它.
* i; ~/ d0 v. n  F/ c6 M& |        /*
8 f! G2 y9 u- L- Q        用法: 对象.事件名Handler = function(evt:Object){};3 F3 T* ~* _: e7 Y; Y; v7 |
        */) s/ {- B4 s0 ]2 k# q
        //this[eventObj.type + "Handler"](eventObj);1 ^+ Y6 p6 N  X; X: h
        this.dispatchQueue(this, eventObj);5 F4 H1 u! y! V* ]( y- P( \
    }( S) g* n( g# d) t/ C
    public function addEventListener(event:String, handler):Void! }+ p! ^' l! N& F
    {3 P; H" q7 \0 ~: Z$ C" K# E6 h7 k
        //这里可以这样理解:( m7 S9 ^, X( R2 i
        /*
% B  k  w8 T# W        使用& L  {+ P5 l. |7 ~" y# a7 h
        addEventListener("click", 事件处理器);0 g, s8 L3 c4 ^2 q9 y! K