AS3.0教程(9):强大的事件机制(5) 占个座位先
Author: 柳世杀神·GabrielGon
18
十一
2006
| AS3.0教程(9):强大的事件机制(5) |
来源: http://www.kingda.org/archives/kingda/2006/08/as3095.html#more
作者:黑羽(KingdaSun)
有兄弟反映,似乎AS3的事件机制有些复杂。 在我看来,编程上 “复杂”这个词一般有两种定义:实现麻烦 ,或者内容众多。 AS3中的事件机制其实现并不麻烦,逻辑更加清楚简单,因此不是“实现麻烦”这一类。 那应该指的是“内容众多”这个意思。黑羽倒觉得"内容众多"往往是褒义词,意味着API丰富,控制范围和深度大。那么一旦得其要领,即思路通畅,记忆深刻,也就不会觉得“复杂”了。
我也会尽量写的简单通俗,照顾新手。但我又要同时考虑到AS2老手们的需求,不让他们打瞌睡。所以AS初学者 看到不懂的地方可以跳过,多用用Event后,有需要再回过头看看我教程的其它部分,一定会有收获。
拿今天要讲的事件发送来说,我预计写以下内容: 1. EventDispatcher和Event的简介 2. 回顾AS2.0事件发送 3. 继承EventDispatcher进行事件发送。 4. 合成EventDispatcher进行事件发送。 5. 实现IEventDispatcher接口来进行事件发送。 与设计模式中的装饰器模式相似。
那么新手看第一,第二,第三部分已经足够应付一般应用。AS2老手们要看看第四部分。 开发大型项目的AS开发者,则第五部分必看。
1.EventDispatcher和Event的简介。 AS3中Object是万物之宗母,且生养众多,共有220多个子类。Event(事件类)和EventDispatcher(事件发送者类)就是在这一代之中。 Event和EventDispatcher是事件机制的两大主角,二者缺一不可。 Event类及其子类的功能就是提供各种具体的事件供EventDispatcher使用,不能干别的。 EventDispatcher则是要让它所有的子类都能发送事件。 那么,AS3就让所有要发送事件的类都统统继承于EventDispatcher。而需要发送事件的类毫无疑问,都是些很重要的类,比如URLLoader,DisplayObject。 其中DisplayObject更是一代霸父,所有可视对象,比如MovieClip,Spirit等等等等统统都是它的子孙。 因此,父以子贵,EventDispatcher在Object的第一代子女中,位高权重,影响极大。
2. 回顾 AS2.0中发送事件 AS2.0中发送事件是怎么干的? 在类中留几个函数对象,如 dispatchEvent:Function,再搞一个EventDispatcher.initialize()来初始化一下要发送事件的类,然后,就搞定了。…..好简单。 但AS3中更简单,更加标准。
3.继承EventDispatcher进行事件发送。 继承是最方便最快的一种。 刚刚说过了,所有的可视对象都继承DisplayObject,是EventDispatcher的孙子辈,因此都可以直接使用dispatchEvent()来发送事件了。 看代码,我们让一个普通的MovieClip, KingdaMC,来发送一个莫名其妙的事件,比如说"KingdaPlaySC"。
KingdaMC.dispatchEvent(new Event("KingdaPlaySC"));
现在我们要让一个我们自己的类来发送事件。
以下为一个名叫KingdaSampleClass的Document Class,请自行和一个Fla绑定,如果忘了怎么弄,看第三篇教程。 ————————————————- package { import flash.display.Sprite; import flash.events.Event; public class KingdaSampleClass extends Sprite { public function KingdaSampleClass() { //生成一个KingdaSampleDispatcher的实例 var dispatcher:KingdaSampleDispatcher = new KingdaSampleDispatcher();
//标准的实现 dispatcher.addEventListener(KingdaSampleDispatcher.ACTION, actionHandler); dispatcher.doSomething(); //可以用直接字符串标识事件类型,但推荐使用静态加const的字符串 dispatcher.addEventListener("KingdaPlaySC", anotherHandler);
//直接用new Event生成一个新的事件对象,该对象的事件类型为"KingdaPlaySC" dispatcher.dispatchEvent(new Event("KingdaPlaySC")); //输出: //action的侦听器: [Event type="action" bubbles=false cancelable=false eventPhase=2] //KingdaPlaySC的侦听器: [Event type="KingdaPlaySC" bubbles=false cancelable=false eventPhase=2] } private function actionHandler(event:Event):void { trace("action的侦听器: " + event); } private function anotherHandler(event:Event):void { trace("KingdaPlaySC的侦听器: " + event); } } } import flash.events.EventDispatcher; import flash.events.Event; class KingdaSampleDispatcher extends EventDispatcher { public static var ACTION:String = "action"; //如果你需要在自己类中某个方法中发送事件,那么示例如下 public function doSomething():void { //你的代码….. //发送事件 dispatchEvent(new Event(KingdaSampleDispatcher.ACTION)); } } |
最活跃用户