Flex中的事件机制[转载]

<table cellspacing="0" cellpadding="0" style="width: 100%"><tr><td class="t_msgfont" id="postmessage_99">
<div id="ad_thread3_0"></div> 一. 事件简介 <br /><br />
事件可以由外设触发, 比如:键盘,鼠标, 也可能是外部输入, 比如:web service的返回. <br />
事件还能由组件的外观和生命周期发生变化时触发, 比如:组件的创建或者改变大小. <br />
所有用户与应用交互都会产生事件.用户没有直接与应用交互也可能产生事件, 比如:数据装载完毕. <br />
你可以在程序中使用事件监听器监听这些事件. 事件监听器是函数方法用于响应指定的事件. 有时也称之为事件处理器. <br />
Flex的事件模型基于DOM3事件模型. <br />
组件产生派发事件并消费(监听)其他事件.如果一个对象想要了解其他对象事件的信息, 可以注册一个监听器. <br />
当事件发生时,对象派发此事件到所有注册过的监听器中. <br />
组件有Flex提供的内建事件. 也可以使用派发-监听模型定义自己的事件监听器, 并指定监听器监听何种事件. <br /><br />
二. 事件流简介 <br /><br />
当一个事件被派发出来时, 事件对象从根节点开始自上而下开始扫描display list, 一直到目标对象, 检查每个节点是否有相应的监听器. <br />
目标对象指的是display list中产生事件的对象. 比如: <br />
<mx:Panel> <br />
<mx:HBox> <br />
<mx:VBox> <br />
<mx:Button /> <br />
</mx:VBox> <br />
</mx:HBox> <br />
</mx:Panel> <br />
如何此时 resize了VBox, 则会从根(Application)开始, 下来检查Panel, HBox, 直到目标对象-产生resize事件的VBox为止. <br /><br />
三. 事件的派发 <br /><br />
Flex中可以通过dispatchEvent()方法手工派发事件, 所有UIComponent的子类都可以调用此方法. <br />
语法: <br />
objectInstance.dispatchEvent(new Event("event_type"):Boolean <br />
参数event_type是Event对象的type属性. 函数的返回值总是True. <br />
可以使用此方法派发任意事件, 而不仅仅是用户自定义事件, 比如: 可以派发一个Button的Click事件. <br />
var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK)); <br /><br />
在Flex应用中不是必须对新派发的事件进行处理, 如果触发了一个事件, 而没有对应的Listener时,Flex忽略此事件. <br />
如果想给Event对象添加新属性, 就必须继承Event类,然后定义新属性 <br /><br />
四.事件的传播: <br /><br />
事件触发后, Flex有3个检测事件监听器的阶段, 3个阶段的发生的顺序如下: <br />
1. 捕获 <br />
2. 目标 <br />
3. 上浮 <br />
在任意一个阶段, 节点们都有机会操作事件. 比如: 用户点击了一个在VBox中的Button, <br />
在捕获阶段, Flex检查Application对象(根节点)和VBox是否有监听器处理此事件. Flex然后在目标阶段触发按钮的监听器. <br />
在上浮阶段, VBox和应用以与捕获阶段相反的顺序再次获得机会处理事件. <br />
在Actionscript3.0中,你可以在任意目标节点上注册事件监听器. 但是部分事件会被直接传给目标节点,比如Socket类. <br />
捕获阶段的节点顺序是从父节点到子节点的, 而上浮阶段刚好相反. <br />
捕获事件缺省是关闭的,也就是说如果要捕获事件, 必须显式指定在捕获阶段进行处理. <br />
每一个Event都有target和currentTarget属性, 帮助跟踪事件传播的过程. <br /><br />
捕获阶段: <br />
在捕获阶段,Flex在显示列表中检查事件的祖先是否注册了事件的监听器. Flex从根节点开始顺序而下. <br />
大多数情况中, 根节点是Application对象. 同时, Flex改变事件的currentTarget值. <br />
缺省情况下, 在此阶段,没有容器监听事件. use_capture参数的值是False,在此阶段添加监听的唯一方法是在调用add_listener时, <br />
传入一个为True值的use_capture参数, 比如: <br />
myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true); <br />
如果是在Mxml中添加监听, Flex设置此参数为False, 没有办法进行修改. <br />
如果设置了use_capture为True, 那么事件将不会上浮. 如果既想捕获又想上浮就必须调用 addEventListener两次. <br />
一次use_capture参数为true, 一次为false; <br />
捕获很少使用, 上浮的使用更为普遍. <br /><br />
目标阶段: <br />
在目标阶段, Flex激发事件的监听程序, 不检查其他的节点. <br /><br />
上浮阶段: <br />
事件只在bubbles属性为True时才进行上浮. 可以上浮的事件包括: change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp. <br />
在上浮阶段, Flex改变事件的currentTarget属性, 而target属性是初始派发事件的对象. <br /><br />
查询事件阶段: <br />
使用事件的eventPhase可以获得事件当前的阶段, <br />
1: CAPTURE_PHASE <br />
2: AT_TARGET <br />
3: BUBBLING_PHASE <br />
示例: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); } <br /><br />
停止传播: <br />
使用下面两个函数停止事件的传播: <br />
stopPropagation() <br />
stopImmediatePropagation()<br /><br />
事件是一个非常有用的功能,通常用于信息传递交互大大提高程序编写的灵活性。在高级语言中都会集成这方面特性;Flex也不例外几乎所有控件中都集成了大量的事件,如果Button的Click事件等。但实际应用中控件自有的事件是不能满真实需要的,特别在自己编写自定义控件时,自定义控件内部信息的改变如何及时通知所在的容器变得很更要;这个时候自定义事件就起到它的作用。<br /><br />
在Flex中定义事件有两中情况,分别是ActionScript和MXML中定义。<br /><br />
在ActionScript中定义:<br /><br />
[Event(name="myEnableEvent", type="flash.events.Event")]<br /><br />
public class MyComponent extends UIComponent<br /><br />
{<br /><br />
...<br /><br />
}<br /><br />
在MXML中定义:<br /><br />
<mx:Metadata><br /><br />
[Event(name="DataChange", type="DataChangeEvent")]<br /><br />
</mx:Metadata><br /><br />
DataChangeEvent事件参数的定义:<br /><br />
import flash.events.Event;<br /><br />
public class DataChangeEvent extends flash.events.Event<br /><br />
{<br /><br />
public function DataChangeEvent()<br /><br />
{<br /><br />
super("DataChange");<br /><br />
}<br /><br />
public var Data:Object;<br /><br />
}<br /><br /><br />
在自定义控件中定义和触发事件:<br /><br />
<?xml version="1.0" encoding="utf-8"?><br /><br />
<mx:Form xmlns:mx="http://www.adobe.com/2006/mxml" width="212" height="56"><br /><br />
<mx:Metadata><br /><br />
[Event(name="DataChange", type="DataChangeEvent")]<br /><br />
</mx:Metadata><br /><br />
<mx:Button label="Button" click="Change()"/><br /><br />
<mx:Script><br /><br />
<![CDATA[<br /><br />
function Change():void<br /><br />
{<br /><br />
this.dispatchEvent(new DataChangeEvent());<br /><br />
}<br /><br />
]]><br /><br />
</mx:Script><br /><br />
</mx:Form><br /><br />
容器接收相关自定义控件事件:<br /><br />
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*"><br /><br />
<ns1:EmployeeCombo x="146" y="132" DataChange="onChange(event)" ><br /><br />
</ns1:EmployeeCombo><br /><br />
<mx:Script><br /><br />
<![CDATA[<br /><br />
import mx.controls.Alert;<br /><br />
function onChange(e:DataChangeEvent)<br /><br />
{<br /><br />
<br /><br />
}<br /><br />
]]><br /><br />
</mx:Script><br /><br />
</mx:Application><br /><br />
其实自定义事件的现实也很简单,但起着非常重要的作用;正是因为有了事件的机制,使得大部分重复的功能抽取到自定义控件中,从而达到一个很高的代码重用性。<!--++ plugin_code qcomic begin-->
<!--++ plugin_code qcomic end--></td></tr></table>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值