dispatchEvent 与 addEventListener

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

?
1
2
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)函数被执行

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

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

?
1
2
3
4
5
6
7
8
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事件
完整过程如下:

?
1
2
3
4
5
6
7
8
9
10
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的代码,此处略...
}

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

?
1
2
3
4
5
6
7
8
9
10
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);
     }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值