概念
所有可视化对象都会派生自己的事件,每个组件都可以注册多个监听器。
EventDispatcher和IeventDispatcher负责实现事件模型,IeventDispatcher包含事件模型应该具备的基本方法:派发事件和注册监听器,移除监听器。
当注册了监听器,使用完后要使用remove移除
事件对象必须是Event或Event的子类
addEventListener
priority:优先级,设置事件监听函数的顺序
userWeakReference:弱引用和垃圾回收有关
用途
事件对象存储数据
事件对象成员函数操作事件对象和影响事件处理系统的行为
派发规则
1. 当事件源对象是一个不在显示列表中的孤立对象时,只有自己是目标对象
2. 当事件源对象在显示列表中,则派发顺序从最顶级的stage向下经过各级父显示对象,到达事件源对象,如果事件对象在构造时设定事件的bubbles属性为true,则会返回到达舞台对象,冒泡阶段不是必须的。
则:
Stage可以接收所有显示对象派发的事件
Stage第一个接收到显示对象派发的事件
3. 某些类型的事件(enterFrame和Init)会直接派发给事件源对象,而不参与捕获和冒泡阶段。
事件派发不是异步的,如
This.dispatchEvent(e);
Trace(‘s’); //会在所有监听器执行完毕后才执行
mxml自定义事件
组件定义
<mx:Metadata>
[Event(name="DataChange", type="DataChangeEvent")]
</mx:Metadata>
而且在as中要有dispatchEvent DataChange事件的代码
访问方式
<ns1:EmployeeCombo x="146" y="132" DataChange="onChange(event)" />
我的理解是: 调用端通过DataChange,其实是 EmployeeCombo.addEventListener(DataChange, function(event:DataChangeEvent)),子组件中this.dispatchEvent(new DataChangeEvent()). 所以才能接收,而且对自定义组件也适用。
As自定义事件
1. 发出事件的类,继承自EventDispatcher或者实现IeventDispatcher
2. 创建事件类,类中新建静态常量(事件类型),并定义需要传递的属性,重写toString或formatToString,否则不会自定义事件中的新属性
3. 需要传递参数才需要自定义事件类,否则只需在发出事件的类中创建事件类型常量,如下:
dispatchEvent(new Event("type")) addEventListener("type",function)
拖拽事件
Flex组件内置了拖拽事件的接口,有些控件已经实现拖拽功能,如List,DataGrid,Menu, TileList,Tree。
当在不同类型控件见拖拽时,数据源的数据结构必须兼容
开发自定义的拖拽:对提供方的mouseDown,mouseOver,dragComplete方法监听,对接收方的dragEnter dragDrop dragOver drageExit事件监听
修改默认事件处理
如:默认关闭变成关闭前提示确认后关闭
思路:在组件外部定义事件处理程序,执行优先级高于默认的事件处理程序。
1. 组件内部:创建事件对象时,设置cancelable为true
dispatchEvent(new Event(“alarm”,false,true))
2. 组件内部:添加默认事件处理程序,设置优先级EventPriority.DEFAULT_HANDLER
addEventListener(“alarm”,handleAlarm,false, EventPriority.DEFAULT_HANDLER,true)
3. 组件外部:自定义事件处理程序中,调用event.preventDefault阻止默认的执行
4. 组件内部:默认事件处理程序中,使用event.isDefaultPrevented() 判断是否阻止了默认执行,并执行相应逻辑
handleAlarm中
if(!event.isDefaultPrevented())
组件外部:
<remote:MyComponent test="testHandler" />
privatefunction testHandler(e:Event):void {
e.type;
e.preventDefault(); //阻止默认事件处理程序的执行
}
组件内部:
package remote
{
import flash.events.Event;
import mx.controls.Alert;
import mx.core.EventPriority;
import mx.core.UIComponent;
[Event(name="test",type="flash.events.Event")]
publicclass MyComponent extends UIComponent
{
publicfunction MyComponent()
{
//为alarm添加默认事件监听,default_handler为低优先级,可以使得外部的事件监听优先执行,从而用户
//可以通过e.preventDefault() 来取消默认事件处理程序
this.addEventListener("test",testEventHandler,false,EventPriority.DEFAULT_HANDLER,true);
}
privatefunction testEventHandler(e:Event):void {
//检查默认处理程序是否被阻止
if(!e.isDefaultPrevented()) {
Alert.show("事件默认处理程序");
}
}
publicfunction run():void {
//第三个参数 true,代表可通过event.isDefaultPrevented() 取消事件
this.dispatchEvent(new Event("test",false,true));
}
}
}