zoukankan      html  css  js  c++  java
  • dispatchEvent 的原理(本文为转载)

    先假设我们有一个自定义事件类型MyEvent.OPEN_QQ(打开QQ的自定义事件)
    首先定义一个显示对象(注意所有显示对象都是EventDispatcher的直接或间接子类,EventDispatcher中定义了dispatchEvent方法)

    var a:Sprite = new Sprite(); 
    a.addEventListener(MyEvent.OPEN_QQ, openqq);  //添加打开QQ这个事件的监听器
    

     最关键的地方来了:当你打开qq时,理论上讲你已经触发了打开qq这个事件。但是由于MyEvent.OPEN_QQ事件是一个自定义事件,flash系统是不可能通知a对象已经发生了MyEvent.OPEN_QQ这个事件的,这里就必须有一种让a知道发生了MyEvent.OPEN_QQ这个事件的一种机制,于是dispatchEvent登场了,你在任何时候调用如下面的语句3,flash都会告知a已经发生了MyEvent.OPEN_QQ这个事件,你可以执行了相应的事件处理函数了(此处为openqq),于是openqq(e:MyEvent)函数被执行

    3、a.dispatchEvent(new MyEvent(MyEvent.OPEN_QQ));
    

     下面对这两行代码针对dispatchEvent的原理做分析:
    此处的a即为原理中所提到的调用者
    由dispatchEvent(Object)方法的参数我们知道,参数必须为Event类型,所以参数Object必须为Event类的实例,所以由上面代码中new MyEvent(MyEvent.OPEN_QQ)可以得出MyEvent的类定义应该为下面形式:

    public class MyEvent extends Event{
        //下面的语句定义了事件类型常量,此处为打开QQ这个事件的标识符
        public static const OPEN_QQ:String = "openQQ";
        //构造函数
        public function MyEvent(type:String){
            super(type);
        }
    }
    

     上面的MyEvent即为我们的自定义事件类,MyEvent.OPEN_QQ即为其中的一个自定义事件

    我们一般在系统事件中调用dispatchEvent方法通知自定义事件的发生(当然你可以在任何地方)。
    例子:当我点击舞台时,通知a发生了MyEvent.OPEN_QQ事件
    完整过程如下:

    var a:Sprite = new Sprite(); 
    a.addEventListener(MyEvent.OPEN_QQ, openqq);
    stage.addEventListener(MouseEvent.CLICK, handle); //注册一个鼠标点击舞台的监听器
    private function handle(e:MouseEvent):void{
        //当鼠标点击舞台时,我们通知a对象发生了打开qq这个事件,a对象会执行openqq函数
        a.dispatchEvent(new MyEvent(MyEvent.OPEN_QQ));
    }
    private function openqq(e:MyEvent):void{
        //执行打开qq的代码,此处略...
    }
    

     当然上面的自定义事件还可以加相应的事件属性,如

    public class MyEvent extends Event{
        //下面的语句定义了事件类型常量,此处为打开QQ这个事件的标识符
        public static const OPEN_QQ:String = "openQQ";
        //自定义属性
        public var myAttribute:String = "Test";
        //构造函数
        public function MyEvent(type:String){
            super(type);
        }
    }
    
  • 相关阅读:
    cocos2dx CCSprite自动拉伸全屏
    linux 安装输入法
    linux jdk 配置
    Proguard.cfg 配置
    C++基本概念
    查看android keystore 别名
    view onTouch,onClick,onLongClick
    LiteDB V4.1.4版本 查询日期写法 C#
    解决Highcharts 5.0.7,IE8下bar类型图表无法显示的问题
    AspNetCore AmbiguousMatchException: The request matched multiple endpoints. Matches
  • 原文地址:https://www.cnblogs.com/wqing/p/2410126.html
Copyright © 2011-2022 走看看