Chapter 4: About Event

About events

关于事件

      事件(Event)让一个开发者了解Flex应用中发生了什么。用户的设备比如鼠标、键盘或是其他一些输入比如web service返回的结果都可以产生事件,在一个组件的显示或生命周期中当反生变化时,比如组件的创建和销毁或者大小的改变,都会触发事件。


      和用户的任何交互都会产生event。当然如果没有和用户的直接交互事件也会发生,例如当如服务器端加载数据完成的时候或者附加的摄像机被激活时。在你的代码中通过添加事件处理函数来处理这些event,Event handlers就是你用来响应特定事件的,有时候也叫他们事件监听器。Flex中的事件模型是基于DOM3的事件模型,尽管Flex没有遵守DOM中的标准,但是他们的实现都是非常相似的。 Flex中的事件模型由Event object和它的子类以及事件派发模型组成。


      组件产生、派发事件并且监听其他的事件。一个需要得到其他对象事件信息的对象可以为那个对象注册一个监听器。当事件发生时,这个对象派发该事件到所有注册了的监听器,通过调用注册的监听函数。为了能够接收到一个对象的多个事件,你必须为每一个事件注册一个监听器。

 

      组件有一些内嵌的事件,你可以在你的XMML的Actionscript代码块中处理它们。你也可以在你的应用外利用Flex事件系统的派发-监听模型来定义你自己的事件监听器,从而可以定义自定义的监听器来监听特定的事件。你可以给目标对象注册监听器从而当目标对象派发事件时,监听器可以被调用。所有的可视化对象,包括Flex的控件和容器都是DisplayObject类的子类,他们都处在一个组成你的应用的可视对象树中,根节点是Stage,在它下面是SystemManager对象,然后是Application对象,孩子容器和组件都是该树的叶子节点。该树就是显示列表,在这个显示列表中的对象类似于DOM分层结构中的节点。display list object和node这两个专业术语意思是一样的。

 

 


About the Event flow

关于事件流
       

      你可以通知任何的容器或组件让它来监听其他的容易或组件派发的事件。当 Adobe Flash  Player派发一个Event对象时,这个Event对象将会从根节点到目标节点运行一周来为注册的监听器逐一检查每个节点,目标节点就是display list中的事件源。例如一个用户点击了一个Child1的按钮,Flash Player降佣Child1来派发该事件,Child1就是目标节点。

事件流在概念上呗划分为三个时期: 捕获阶段、目标阶段和冒泡阶段。

 


 
 关于捕获阶段

      事件流的第一阶段就是捕获阶段。该阶段由根节点到目标节点的父节点组成(注意:不包括该目标节点),在这期间,Flash Player检查每一个节点,从根节点开始,来检查是否这个节点注册了该事件的事件监听器。如果注册了, Flash Player给Event对象设置适当的值然后调用这个监听器。 Flash Player讲停止检查当它到达该目标节点的parent同样,如果父节点也注册了相应的事件监听器,也将会调用该监听器。

 

关于目标阶段

      第二阶段是目标阶段,它仅仅由目标节点一个组成。Flash Player将会给Event对象填充具体的一些值,检查目标节点上是否注册了该事件的事件监听器,如果是就调用他们。

 


 关于冒泡阶段

事件流的第三阶段,冒泡阶段,由从目标节点的父节点到根节点这些节点组成。从目标节点的父节点开始,Flash Player给Event对象填充具体的值, 逐一检查这些节点,如果有有该事件的事件监听器,就调用它。当到达根节点时,就会停止。

 


 关于Event类

       flash.events.Event是事件发生时具有一些包含特定信息属性的类。Event类的对象是隐式创建的,非常类似于JSP当中的request和response对象,每次当有事件派发时,Flex创建一个Event对象,你可以在事件监听函数中使用Event对象来得到被派发Event对象的具体信息或是得到关于派发该事件的组件的相关信息。在传递Event对象和使用Event对象中,事件监听器是可以选择的。可是,如果你想在你的事件监听器中访问这个event对象属性,你就必须把该Event对象传递给事件监听器。

当一个事件被派发时,Flex只会创建一个Event对象,在冒泡和捕获阶段,Flex改变这个Event对象中的值当它沿着该Display list上下移动的时候,而不是为每一个节点都创建一个Event对象。

 


 关于Event类的子类

      flash.events.Event类有许多子类,这些子类几乎都在mx.events.* flash.events.*这两个包下。

 mx.events包中定义的事件类是为Flex中控件所指定的,包括DataGridEvent,DragEvent和ColorPickerEvent。

flash.events包中的描述的类是在Flex和Flash Player都有的。这些事件类包括MouseEvent, DataEvent, and TextEvent.所有的这些类在Flex中都是通用的。

除了这两个包,还有些其他的包也定义了自己的事件对象,比如 mx.messaging.events.ChannelEvent 和 mx.logging.LogEvent.

Event类的子类都有属于他们自己额外的独特的属性和方法。某些时候,你想使用一个更具体的事件类型而不是一般的Event对象以便你可以访问那些唯一的属性或方法。例如,LogEvent类有getLevelString()方法而Event类没有此方法。

 


关于EventDispatcher类

      每个在display list中的类都能顺着继承链回溯到DisplayObject类。DisplayObject类反过来继承自EventDispatcher类,EventDispatcher类是个基类,它在功能上为display list中的每个对象提供了非常重要的事件模型。因为DisplayObject类继承了

EventDispatcher类,在display list 中的任何对象都可以访问EventDispatcher中的方法。
      这是非常有意义的。因为在display list中的每个元素都能充分的参与进事件模型中来。在display list中的每个对象可以使用addEventListener()方法,该方法继承自EventDispatcher类,来监听一个特定的事件,只要这个正在监听的对象是那个特定事件的事件流中的一部分。
    

      EventDispatcher类继承了IEventDispatcher接口。这样就允许想创建自定义类而又不能继承EventDispatcher类或者它的一个子类的开发者可以继承IEventDispatcher接口来访问它的方法。


    

     addEventListener()方法是EventDispatcher类的最重要的方法之一,可以用来注册事件监听器。

 

     高级开发者使用dispatchEvent()方法来手动派发事件或者发送一个自定义的事件对象到事件流中。

EventDispatcher类中还有些其他的方法提供了关于存在的事件监听器的有用的信息。 hasEventListener()方法判断在特定的display list 对象上是否有某个事件类型的事件监听器,如果有则返回true。 willTrigger()方法 不仅仅是检查特定的display list 对象上的每个事件监听器而且为事件流中的所有时期检查display list中的所有祖先上的监听器。 如果有一个则会返回true。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值