FlexBuilder有很多值得学习的地方,本文和大家重点讨论一下FlexBuilder教程中如何使用ActionScript处理事件,相信通过本文的学习你对FlexBuilder中ActionScript处理事件有明确的认识。
FlexBuilder教程中使用ActionScript处理事件
1,事件模型与机制
FlexBuilder教程中Flex的事件模型基于DOM3事件模型。通过创建注册事件监听器(事件处理程序,事件处理器,是函数方法用于响应指定的事件),可以在组件的实例发出某个事件(如用户何时与界面组件交互,以及在组件的外观或生命周期中何时发生重要的变化,如组件的创建或破坏或调整其大小等)时,对象事件自动派发此事件到所有注册过的监听器。
1)、事件流:
当一个事件被派发出来时,事件对象从根节点开始自上而下开始扫描displaylist(如),一直到目标对象,检查每个节点是否有相应的监听器。目标对象指的是displaylist中产生事件的对象.比如:<mx:Panel><mx:HBox><mx:VBox><mx:Button/></mx:VBox></mx:HBox></mx:Panel>。如果此时resize了VBox,则会从根(Application)开始,下来检查Panel,HBox,直到目标对象-产生resize事件的VBox为止.
2)、事件的派发:
Flex中可以通过dispatchEvent()方法手工派发事件,所有UIComponent的子类都可以调用此方法.语法://参数event_type是Event对象的type属性
//函数的返回值总是True.
objectInstance.dispatchEvent(newEvent("event_type"):Boolean
可以使用此方法派发任意事件,而不仅仅是用户自定义事件,比如:可以派发一个Button的Click事件.varresult:Boolean=buttonInstance.dispatchEvent(newEvent(MouseEvent.CLICK));
在Flex应用中不是必须对新派发的事件进行处理,如果触发了一个事件,而没有对应的Listener时,Flex忽略此事件.
如果想给Event对象添加新属性,就必须继承Event类,然后定义新属性
3)、事件的传播
FlexBuilder教程中事件触发后,Flex有3个检测事件监听器的阶段,3个阶段的发生的顺序如下:
A.捕获阶段:在捕获阶段,Flex在显示列表中检查事件的祖先是否注册了事件的监听器.Flex从根节点开始顺序而下.大多数情况中,根节点是Application对象.同时,Flex改变事件的currentTarget值.缺省情况下,在此阶段,没有容器监听事件.use_capture参数的值是False,在此阶段添加监听的唯一方法是在调用add_listener时,传入一个为True值的use_capture参数,比如:myAccordion.addEventListener(MouseEvent.MOUSE_DOWN,customLogEvent,true);
如果是在Mxml中添加监听,Flex设置此参数为False,没有办法进行修改.如果设置了use_capture为True,那么事件将不会上浮.如果既想捕获又想上浮就必须调用addEventListener两次.一次use_capture参数为true,一次为false;捕获很少使用,上浮的使用更为普遍.
B.目标阶段:在目标阶段,Flex激发事件的监听程序,不检查其他的节点.
C.上浮阶段:事件只在bubbles属性为True时才进行上浮.可以上浮的事件包括:change,click,doubleClick,keyDown,keyUp,mouseDown,mouseUp.在上浮阶段,Flex改变事件的currentTarget属性,而target属性是初始派发事件的对象.
在任意一个阶段,节点们都有机会操作事件.比如:用户点击了一个在VBox中的Button,在捕获阶段,Flex检查Application对象(根节点)和VBox是否有监听器处理此事件.Flex然后在目标阶段触发按钮的监听器.在上浮阶段,VBox和应用以与捕获阶段相反的顺序再次获得机会处理事件.
在Actionscript3.0中,你可以在任意目标节点上注册事件监听器.但是部分事件会被直接传给目标节点,比如Socket类.捕获阶段的节点顺序是从父节点到子节点的,而上浮阶段刚好相反.
捕获事件缺省是关闭的,也就是说如果要捕获事件,必须显式指定在捕获阶段进行处理.
每一个Event都有target和currentTarget属性,帮助跟踪事件传播的过程.
4)、查询事件阶段
FlexBuilder教程使用事件的eventPhase可以获得事件当前的阶段,
1):CAPTURE_PHASE
2):AT_TARGET
3):BUBBLING_PHASE
示例:privatefunctiondetermineState(event:MouseEvent):Void{Debug.trace(event.eventPhase+":"+event.currentTarget.id);}
5)、停止传播
使用下面两个函数停止事件的传播:
stopPropagation()
stopImmediatePropagation()
2,FlexBuilder教程中如何创建监听器
组件有Flex提供的内建事件.也可以使用派发-监听模型定义自己的事件监听器,并指定监听器监听何种事件.
有三种方式:
1),内部MXML中的AS函数法:在MXML的<mx:Script></mx:Script>声明中注册监听器:这是第一个和使用最广泛的方法,在MXML中定义事件发生时会调用的事件处理程序。
2),外部AS文件中的AS函数法:通过ActionScript定义注册事件处理程序:可以通过使用ActionScript中的addEventHandler()等方法来注册事件处理程序。可将addEventHandler()方法置于Application容器的creationComplete事件(在Application表单及其子级被初始化之后,在启动应用程序时发生)的事件处理程序中。详见ActionScript教程。
3),代码混写法:在MXML的控件标签中直接完全嵌入监听器(这也称为使用线上事件处理程序):这样比较直接,代码也较少,但会导致代码很难阅读、维护和缩放。如果监听器是多个AS语句甚至更复杂的逻辑,不推荐此方法。
【编辑推荐】
- FlexBuilder教程教你如何使用特效丰富用户体验
- 从Flex Builder更名看Flash平台战略
- Flex及FlexBuilder2.0开发环境详解
- FlexBuilder3.0与Eclipse3.4的完美结合
- 学习笔记 FlexBuilder2.0中如何使用基于Lists的控件