[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: 1 timer: 2 timer: 3 timer: 4 timer: 5 timerComplete 下一节:[6.建立强大的事件处理机制]
经典论坛讨论: http://bbs.blueidea.com/thread-2768209-1-1.html
出处:蓝色理想
责任编辑:蓝色月光
上一页 [AS2]事件处理机制 -- 使用addListener方法 一 下一页 [AS2]事件处理机制 -- 建立强大的事件处理机制
◎进入论坛Flash专栏版块参加讨论
|