使用事件
一、 关于事件
事件可以在Flex程序中发生了一些事情的时候让开发者知道所发生的事件。你可以通过用户指令创建,例如鼠标和按键,或者外部的输入,例如从一个Web服务调用返回。当事件的外观或生命周期发生改变的时候,同样会触发事件。例如:当控件重新调整尺寸的时候,创建或销毁一个组件。
任何用户与程序的交互都可以产生事件。即使没有任何用户直接的交互,事件也会发生。例如,当一个摄像头被激活,或者从远程服务器加载数据完毕的时候。你可以通过在代码中添加事件处理器来处理这些事件。事件处理器是编写的用以响应特定事件的方法。它们有时会被关联到一个事件监听器。
组件生成、调度并销毁他们的事件。一个对象需要关于其他对象事件注册的监听器的信息。当一个事件发生时,对象通过方法调用将事件分发到所有注册的监听器。要接同一个对象的多个事件,必须为每个事件注册监听器。
组件持有可以让你在MXML程序中的ActionScript代码块里处理的内建事件。你也可以按照Flex 事件系统的调度者——监听者模式在程序外部定义你自己的事件监听器,并且定义由你的用户自定义监听器的哪个方法来监听城建的事件。你可以向目标对象注册监听器。当目标对象调度一个事件的时候,监听器将被调用。
所有的可视对象,包括Flex控件和容器,都是DisplayObject类的子类。它们位于构成你应用程序的树状结构中。树的根是一个Stage(舞台)。在Stage下面是SystemManager对象,然后是Application对象。子容器和组件都是数的叶节点。这个树可以被理解为一个显示列表。一个在位于显示列表中的对象与一个DOM节点相似。
1. 关于事件流
你可以指示任何的容器或控件来监听被其他容器或控件调度的事件。当Adobe Flash Player调度一个事件对象的时候,事件对象将在显示列表中创建一个从根到目标节点的路线,并在此路线的每个节点上检查注册的监听器。
事件流从概念上讲分为三个部分:捕获阶段、目标匹配阶段和冒泡阶段。
关于捕获阶段
事件留的第一部分叫做捕获阶段。这个阶段包括从根节点到目标节点的父节点的所有节点。在这个阶段,Flash Player从根节点开始检查每个节点,看它是否持有一个被注册为处理此事件的监听器。如果持有这个监听器,Flash Player将为Event对象设定适当的值,并调用监听器。Flash Player将在到达目标节点的父节点并在其父节点上执行了任意注册的监听器之后停止。
关于目标匹配阶段
事件流的第二个部分是目标匹配阶段,只包括目标节点。Flash Player为Event类设定适当的值,并检查目标节点是否注册了事件监听器,如果目标节点注册了事件监听器,则调用监听器。
关于冒泡阶段
事件流的第三个部分是冒泡阶段。包括从目标节点的父节点到根节点的所有节点,并从目标节点的父节点开始。Flesh Player为Event对象设定适当的值,并调用每个节点上的事件监听器。FlasyhPlayer将在调用根节点上的任意事件监听器之后停止。
2. 关于事件类
Flash.events.Event类是一个ActionScript类,这个类持有与发生的事件相关的信息。一个Event对象是一个隐式创建的对象,相当于JSP中被应用服务器创建的的request和response对象。
每当一个事件被调度时,Flex都会创建一个Event对象。你可以在一个事件监听器中使用Event对象来访问关于被调度的事件,或者是关于调度这个事件的组件的详细信息。将一个Event对象传递给事件监听器,并在其中使用这个Event对象,这种做法是可选的。不过,如果你希望在监听器中访问Event对象的属性,那么你就必须将Event对象传递给监听器。
当一个事件被调度的时候,Flex只创建一个Event对象。在冒泡和捕获阶段,当Event对象在显示列表中上移或下移的时候,Flex会改变Event的值,而不是为每个节点创建新的Event属性。
3. 关于事件子类
有太多的类继承了flex.events.Event类。这些类中的大部分被定义在下面这两个包中:
mx.events.*
flash.events.*
mx.events包中定义的事件类仅限于Flex控件,包括DataGridEvent,DragEvent和ColorPickerEvent。Flash.events包描述了那些并非Flex特有的而是由Flash Player代为定义的事件。所有浙西事件都可以被普遍的应用于Flex程序。
除了这两个包,一些其他的包也定义了它们自己的事件对象,例如:
mx.messaging.events.ChannelEvent和mx.logging.LogEvent。
Event类的子类拥有额外的属性和方法。在一些情况下,你需要使用一个更加特殊的事件类型以访问这个类型特有的属性和方法。例如,LogEvent类拥有getLevelString()方法,这个方法是Event类没有的。
4. 关于
EventDispatcher类
每个位于显示列表中的对象都继承了DisplayObject类。这个DisplayObject类依次继承了EventDispatcher类。EventDispatcher类是为这个列表中的每个对象提供重要的事件模型功能的基类。因为DisplayObject类继承自EventDispatcher类,所有在显示列表中的对象都可以访问EventDispatcher类中的方法。
这很有意义,因为在显示列表上的每个成员都可以完全的参与到事件模型中。每个显示列表上的对象都可以使用它们继承自EventDispatcher类的addEventListener()方法来监听一个特殊的事件,但是只有在这个监听器对象是事件流的一部分的时候才行。
尽管从EventDispatcher的名字上看似乎这个类的主要职责是发送事件对,不过这个类更加频繁的被用于注册监听器、检查监听器和移除监听器。
EventDispatcher实现了IEventDispatcher接口。这允许开发者不必继承EventDispatcher或EventDispatcher的子类,而是实现IEventDispatcher接口来添加他们自己的方法。
addEventListener()方法是这个类最常用的方法。你用它来注册你自己的事件监听器。
高级程序员会使用dispatchEvent()方法来手动调度事件或发送一个用户自定义事件到事件流。
本文出自 “Flex RIA” 博客,请务必保留此出处http://flexria.blog.51cto.com/753638/154527