| [5.使用 addEventListener 方法(EventDispatcher 类)] 打瞌睡了吧? 貌似有口水流下来了.呵.本人文字表达能力不是很好(好像是没吃多少书).让大家见笑了.其实学编程
 是比较闷的.不只是闷,还有很多很多,但既然选择了,这些就只是学习途中的坎,需要我们跨过去.就像是你选择走哪
 条路一样,既然选择了,就必需是要走的.但这路不只是你一个人走,人多了就会有竞争,我们不能总走在别人后面.所
 以需要加快脚步走在前面,让后面的人去追.但有时也会在不知不觉中走弯路,我一样也会,所以在本文中如果你看到
 有不正确的,希望你能指正,谢谢.此文的目的是想让大家在这条路上能走快点.你很啰嗦呀....呵.题外话就说到这.
 下面继续.
 这一节讲 EventDispatcher 类.此类也是提供事件通知和侦听器管理功能的,但比前面讲的功能会强一些.在 AS2 中,此类用于组件的事件处理机制中.因 Macromedia 没有过多的讲解此类.很少人将它用于自定义类中.本人在研究
 mx包下的类时才知道此类的用法.
 首先看看在组件中如何使用:1.
 function clickHandler(evt:Object):Void{
 trace("click");
 ]
 button.addEventListener("click", clickHandler);
 2.
 function click(evt:Object):Void{
 trace("click");
 ]
 button.addEventListener("click", this);
 3.
 function handleEvent(evt:Object):Void{
 trace("click");
 ]
 button.addEventListener("click", this);
 4.
 button.clickHandler = function(evt:Object){
 trace("click");
 }
 这几种写法其效果都是一样的.都是侦听 button 实例的 click 事件.
 下面来了解此类详细:public addEventListener(eventName:String, 侦听器对象或函数):Void              ---添加事件侦听器
 public removeEventListener(eventName:String, 侦听器对象或函数):Void              ---移除事件侦听器
 public dispatchEvent(eventObj:Object):Void          object:Object):Void
 帮助文档中没有讲解 initialize 方法.此方法的功能同 AsBroadcaster 类的 initialize 方法一样. 该怎么用呢? 看下面的示例:[5.1.示例: EDEventClass 类(简单的示例)]
 此示例文档详细:
 Example/AS2/events/EDEvent/EDEventClass.as
 Example/AS2/events/EDEvent/EDEventExample.as
 Example/AS2/events/EDEvent/EDEventExample.xml
 Example/AS2/events/EDEvent/EDEventExample.fla
 主类:打开 EDEventClass.as 文档,输入下面的代码:
 import mx.utils.Delegate;import mx.events.EventDispatcher;
 //----------------------------------------
 class EDEventClass extends EventDispatcher
 {
 //----------------------------------------
 public var tXML:XML;
 //----------------------------------------
 public function EDEventClass(url:String)
 {
 this.tXML = new XML();
 this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);
 this.tXML.load(url);
 }
 private function XMLonLoad(success:Boolean):Void
 {
 if (success) {
 this.dispatchEvent({type:"complete"});
 }
 }
 //----------------------------------------
 }
 如果不继承 EventDispatcher 类.请将代码改成如下:
 import mx.utils.Delegate;import mx.events.EventDispatcher;
 //----------------------------------------
 class EDEventClass
 {
 //----------------------------------------
 //不继承需添加这三个方法.
 public var addEventListener:Function;
 public var removeEventListener:Function;
 private var dispatchEvent:Function;
 //----------------------------------------
 public var tXML:XML;
 //----------------------------------------
 public function EDEventClass(url:String)
 {
 //还有使用 initialize 静态方法.
 EventDispatcher.initialize(this);
 this.tXML = new XML();
 this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);
 this.tXML.load(url);
 }
 private function XMLonLoad(success:Boolean):Void
 {
 if (success) {
 this.dispatchEvent({type:"complete"});
 }
 }
 //----------------------------------------
 }
 保存文档.
 这里首导入 EventDispatcher 类,你可以选择继承或不继承此类.上面的代码一个是继承,一个是不继承.区别
 也很容易看出来.这里就不讲了.
 示例类:打开 EDEventExample.as 文档,输入下面的代码:
 import EDEventClass;//----------------------------------------
 class EDEventExample
 {
 public function EDEventExample()
 {
 var ee:EDEventClass = new EDEventClass("EDEventExample.xml");
 ee.addEventListener("complete", this);
 }
 private function complete(evt:Object):Void
 {
 trace("complete");
 }
 }
 保存文档.
 在示例类中我们创建主类的一个实例.来加载 EDEventExample.xml 文档.然后添加侦听器.
 如果要移除事件侦听器,请使用下面的方法:
 ee.removeEventListener("complete", this);要加载的 XML 文档:
 打开 EDEventExample.xml 文档,随便输入一些内容便可.测试用.
 示例 fla 文档:打开 EDEventExample.fla 文档.将"图层 1"重命名为  Actions.并在第一帧中输入下面的代码:
 new EDEventExample();保存文档.
 测试 Flash 文档.在 XML 文档成功加载后会在输出面板中显示以下内容
 complete如需给事件传递参数,在发送事件时将参数添加事件对象(请看:1.事件处理机制)中,如下添加:
 this.dispatchEvent({type:"complete", 参数1:"参数1", 参数2:"参数2", 参数N:"参数N");在调用事件时:
 private function complete(evt:Object){
 trace([evt.type, evt.target, evt.参数1, evt.参数2, evt.参数N]);
 }
 下面再看一个示例:
 [5.2.示例: EDTimer 类(定时器)]
 此示例文档详细:
 Classes/AS2/utils/EDTimer.as
 Example/AS2/utils/EDTimer/EDTimerExample.as
 Example/AS2/utils/EDTimer/EDTimerExample.fla
 主类:打开 EDTimer.as 类,输入下面的代码(当不急时,应多打代码(有利于巩固知识).不应 copy/paste):
 import mx.utils.Delegate;import mx.events.EventDispatcher;
 //------------------------------
 class AS2.utils.EDTimer extends EventDispatcher
 {
 //------------------------------
 private var _timerID:Number;
 private var _delay:Number;
 private var _repeatCount:Number;
 private var _currentCount:Number = 0;
 private var _running:Boolean;
 //------------------------------
 /*
 @parameter    delay:            延迟,单位毫秒.
 @parameter    repeatCount:    重复次数.默认为Infinity(正无穷大);
 */
 public function EDTimer(delay:Number, repeatCount:Number)
 {
 if (isNaN(delay)) {
 return;
 }
 if (isNaN(repeatCount)) {
 repeatCount = Infinity;
 }
 this._delay = delay;
 this._repeatCount = repeatCount;
 }
 //------------------------------
 public function reset():Void
 {
 this._currentCount = 0;
 this.stop();
 }
 public function start():Void
 {
 this._timerID = setInterval(Delegate.create(this, this.startTimer), this._delay);
 this._running = true;
 }
 public function stop():Void
 {
 clearInterval(this._timerID);
 this._running = false;
 }
 public function toString():String
 {
 return "[EDTimer]";
 }
 //----------------------------------------
 private function startTimer():Void
 {
 this._currentCount++;
 this.dispatchEvent({type:"timer", currentCount:this._currentCount});
 if (this._currentCount == this._repeatCount) {
 this.reset();
 this.dispatchEvent({type:"timerComplete"});
 }
 }
 //------------------------------
 public function get delay():Number
 {
 return this._delay;
 }
 public function set delay(d:Number):Void
 {
 this._delay = d;
 }
 public function get repeatCount():Number
 {
 return this._repeatCount;
 }
 public function set repeatCount(r:Number):Void
 {
 this._repeatCount = r;
 }
 public function get currentCount():Number
 {
 return this._currentCount;
 }
 public function get running():Boolean
 {
 return this._running;
 }
 //------------------------------
 }
 因此类详细前面已讲,功能一样,只是事件处理机制不同而已.这里就不再啰嗦.
 示例类:打开 EDTimerExample.as 文档,输入下面的代码:
 import AS2.utils.EDTimer;//----------------------------------------
 class EDTimerExample
 {
 //----------------------------------------
 public function EDTimerExample()
 {
 var te:EDTimer = new EDTimer(1000, 5);
 te.addEventListener("timer", this);
 te.addEventListener("timerComplete", this);
 te.start();
 }
 private function timer(evt:Object):Void
 {
 trace("timer: " + evt.currentCount);
 }
 private function timerComplete(evt:Object):Void
 {
 trace(evt.type);
 }
 //----------------------------------------
 }
 示例 fla 文档:
 打开 EDTimerExample.fla 文档,将"图层 1" 重命名为 Actions.并在第一帧中输入下面的代码:
 new EDTimerExample();测试 Flash 文档.输出面板会陆续显示以下的内容:
 timer: 1timer: 2
 timer: 3
 timer: 4
 timer: 5
 timerComplete
 下一节:[6.建立强大的事件处理机制]
 经典论坛讨论:http://bbs.blueidea.com/thread-2768209-1-1.html
 出处:蓝色理想
责任编辑:蓝色月光
 上一页 [AS2]事件处理机制 -- 使用addListener方法 一 下一页 [AS2]事件处理机制 -- 建立强大的事件处理机制 ◎进入论坛Flash专栏版块参加讨论
	      |