加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex中的事件机制

发布时间:2020-12-15 01:04:37 所属栏目:百科 来源:网络整理
导读:? 一. 事件简介 ? 事件可以由外设触发,比如:键盘,鼠标,也可能是外部输入,比如:web service的返回. ? 事件还能由组件的外观和生命周期发生变化时触发,比如:组件的创建或者改变大小. ? 所有用户与应用交互都会产生事件.用户没有直接与应用交互也可能产生事件,
?
一. 事件简介 ?
事件可以由外设触发,比如:键盘,鼠标,也可能是外部输入,比如:web service的返回. ?
事件还能由组件的外观和生命周期发生变化时触发,比如:组件的创建或者改变大小. ?
所有用户与应用交互都会产生事件.用户没有直接与应用交互也可能产生事件,比如:数据装载完毕. ?
你可以在程序中使用事件监听器监听这些事件. 事件监听器是函数方法用于响应指定的事件. 有时也称之为事件处理器. ?
Flex的事件模型基于DOM3事件模型. ?
组件产生派发事件并消费(监听)其他事件.如果一个对象想要了解其他对象事件的信息,可以注册一个监听器. ?
当事件发生时,对象派发此事件到所有注册过的监听器中. ?
组件有Flex提供的内建事件. 也可以使用派发-监听模型定义自己的事件监听器,并指定监听器监听何种事件. ?
二. 事件流简介 ?
当一个事件被派发出来时,事件对象从根节点开始自上而下开始扫描display list,一直到目标对象,检查每个节点是否有相应的监听器. ?
目标对象指的是display list中产生事件的对象. 比如: ?
<mx:Panel> ?
<mx:HBox> ?
<mx:VBox> ?
<mx:Button /> ?
</mx:VBox> ?
</mx:HBox> ?
</mx:Panel> ?
如何此时 resize了VBox,则会从根(Application)开始,下来检查Panel,HBox,直到目标对象-产生resize事件的VBox为止. ?

三. 事件的派发 ?
Flex中可以通过dispatchEvent()方法手工派发事件,所有UIComponent的子类都可以调用此方法. ?
语法: ?
objectInstance.dispatchEvent(new Event("event_type"):Boolean ?
参数event_type是Event对象的type属性. 函数的返回值总是True. ?
可以使用此方法派发任意事件,而不仅仅是用户自定义事件,比如: 可以派发一个Button的Click事件. ?
var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK)); ?

在Flex应用中不是必须对新派发的事件进行处理,如果触发了一个事件,而没有对应的Listener时,Flex忽略此事件. ?
如果想给Event对象添加新属性,就必须继承Event类,然后定义新属性 ?

四.事件的传播: ?
事件触发后,Flex有3个检测事件监听器的阶段,3个阶段的发生的顺序如下: ?
1. 捕获 ?
2. 目标 ?
3. 上浮 ?
在任意一个阶段,节点们都有机会操作事件. 比如: 用户点击了一个在VBox中的Button,?
在捕获阶段,Flex检查Application对象(根节点)和VBox是否有监听器处理此事件. Flex然后在目标阶段触发按钮的监听器. ?
在上浮阶段,VBox和应用以与捕获阶段相反的顺序再次获得机会处理事件. ?
在Action script3.0中,你可以在任意目标节点上注册事件监听器. 但是部分事件会被直接传给目标节点,比如Socket类. ?
捕获阶段的节点顺序是从父节点到子节点的,而上浮阶段刚好相反. ?
捕获事件缺省是关闭的,也就是说如果要捕获事件,必须显式指定在捕获阶段进行处理. ?
每一个Event都有target和currentTarget属性,帮助跟踪事件传播的过程. ?

捕获阶段: ?
在捕获阶段,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; ?
捕获很少使用,上浮的使用更为普遍. ?

目标阶段: ?
在目标阶段,Flex激发事件的监听程序,不检查其他的节点. ?

上浮阶段: ?
事件只在bubbles属性为True时才进行上浮. 可以上浮的事件包括: change,click,doubleClick,keyDown,keyUp,mouseDown,mouseUp. ?
在上浮阶段,Flex改变事件的currentTarget属性,而target属性是初始派发事件的对象. ?

查询事件阶段: ?
使用事件的eventPhase可以获得事件当前的阶段,?
1: CAPTURE_PHASE ?
2: AT_TARGET ?
3: BUBBLING_PHASE ?
示例: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); } ?

停止传播: ?
使用下面两个函数停止事件的传播: ?
stopPropagation() ?
stopImmediatePropagation()

?
件是一个非常有用的功能,通常用于信息传递交互大大提高程序编写的灵活性。在高级语言中都会集成这方面特性;Flex也不例外几乎所有控件中都集成了大量的事件,如果Button的Click事件等。但实际应用中控件自有的事件是不能满真实需要的,特别在自己编写自定义控件时,自定义控件内部信息的改变如何及时通知所在的容器变得很更要;这个时候自定义事件就起到它的作用。

? ?? ? 在Flex中定义事件有两中情况,分别是ActionScript和MXML中定义。

? ?? ? 在ActionScript中定义:

?

CODE:
[Event(name="myEnableEvent",type="flash.events.Event")]

public class MyComponent extends UIComponent

{

? ?? ?? ???...

}

在MXML中定义:

?

CODE:
<mx:Metadata>

? ? [Event(name="DataChange",type="DataChangeEvent")]

</mx:Metadata>

DataChangeEvent事件参数的定义:

?

CODE:
import flash.events.Event;

public class DataChangeEvent extends flash.events.Event

{

? ?? ? public function DataChangeEvent()

? ?? ? {

? ?? ?? ?? ???super("DataChange");

? ?? ? }

? ?? ? public var Data:Object;

}

?

在自定义控件中定义和触发事件:

?

CODE:
<?xml version="1.0" encoding="utf-8"?>

<mx:Form xmlns:mx="http://www.adobe.com/2006/mxml" width="212" height="56">

<mx:Metadata>

? ?? ???[Event(name="DataChange",type="DataChangeEvent")]

? ? </mx:Metadata>

<mx:Button label="Button" click="Change()"/>

? ?? ? <mx:Script>

? ?? ?? ?? ???<![CDATA[

? ?? ?? ?? ?? ?? ?? ?function Change():void

? ?? ?? ?? ?? ?? ?? ?{

? ?? ?? ?? ?? ?? ?? ?? ?? ? this.dispatchEvent(new DataChangeEvent());

? ?? ?? ?? ?? ?? ?? ?}

? ?? ?? ?? ???]]>

? ?? ? </mx:Script>

</mx:Form>

容器接收相关自定义控件事件:

?

CODE:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="*">

? ?? ?

? ?? ? <ns1:EmployeeCombo x="146" y="132" DataChange="onChange(event)" >

? ?? ? </ns1:EmployeeCombo>

? ?? ? <mx:Script>

? ?? ?? ?? ???<![CDATA[

? ?? ?? ?? ?? ?? ?? ?import mx.controls.Alert;

? ?? ?? ?? ?? ?? ?? ?function onChange(e:DataChangeEvent)

? ?? ?? ?? ?? ?? ?? ?{

? ?? ?? ?? ?? ?? ?? ?? ?? ?

? ?? ?? ?? ?? ?? ?? ?}

? ?? ?? ?? ???]]>

? ?? ? </mx:Script>

</mx:Application>

其实自定义事件的现实也很简单,但起着非常重要的作用;正是因为有了事件的机制,使得大部分重复的功能抽取到自定义控件中,从而达到一个很高的代码重用性。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读