热门文章 | 热门软件| 热门源码 | 热门电影 | 知识库 | 联系我们
软件 源码 教程 影视 健康 招聘
  HTML | JavaScript | ASP | PHP | JSP | NET | VB | VC | VF | Windows | Linux | Mysql | Mssql | Oracle | Struts 
当前位置: 创世纪计算机资源网 -> 文章频道 ->flash 
站内搜索:
AS3.0教程:强大的事件机制(5)
作者:黑羽翔天 来源:blog 整理日期:2007-11-19

有兄弟反映,似乎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));
    }
}
此信息来自〖闪无忧〗
查看原网址:http://www.5uflash.com/Html/as3/134806397.html

相关文章