• 【设为首页】
  • 【收藏闪客居】
当前位置:主页>FLASH AS 编程>AS基础篇>AS 3.0>文章内容
  • AS3.0:强大的事件机制(5)
  • 来源:kingda.org 作者:黑羽翔天 2007-10-30 【

有兄弟反映,似乎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"));

现在我们要让一个我们自己的类来发送事件。
 

  //【黑羽】ActionScript 3.0系列教程
  //http://www.kingda.org
//以下为一个名叫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));
    }
}




上一篇:AS3.0:强大的事件机制(4)   下一篇:AS3.0:强大的事件机制(6)
  • 用户名:新注册) 密码: 匿名评论
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)

Copyright © 2006-2008 flashas.net All Rights Reserved.
网站内容咨询: admin#flashas.net (#为@) 联系QQ:40777822 浙ICP备06033001号
(本网站最佳浏览解析度为1024*768, 建议使用IE 6.0或以上版本浏览器。)