使用events
在flex中使用event需要二步,你需要定义一个函数或者类方法来处理事件
可以通过addEvent
<?xml version="1.0"?>
<!-- events/SimpleEventHandler.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">
<mx:Script><![CDATA[
import mx.controls.Alert;
private function initApp():void {
b1.addEventListener(MouseEvent.CLICK, myEventHandler);
}
private function myEventHandler(event:Event):void {
Alert.show("An event occurred.");
}
]]></mx:Script>
<mx:Button id="b1" label="Click Me"/>
</mx:Application>
也可以采用
<?xml version="1.0"?>
<!-- events/SimplerEventHandler.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import mx.controls.Alert;
private function myEventHandler(event:Event):void {
Alert.show("An event occurred.");
}
]]></mx:Script>
<mx:Button id="b1" label="Click Me" click="myEventHandler(event)"/>
</mx:Application>
上面的二中方法是一样的,但是建议采用addEventListener的方式
专门化Event对象
添加事件的方式通过参数传入
function myEventListener(e:Event):void;
import mx.event.ToolTip
function myEventListener(e:ToolTipEvent):void
访问currentTarget属性
currentTaget属性就是事件关联的组件
注册事件处理
1、定义处理函数
<mx:tag_name event_name="handler_function"/>
2、使用addEventListener方法注册
comonentInstance.addEventListener(
event_typ:String,
event_listener:Function,
user_capture:Boolean,
priority:int,
weakRef:Boolean)
给处理函数增加参数
由于addEventListener已经确定量4个参数,所以无法在添加参数,那可以在处理函数上添加参数
<mx:Script>
public function addListeners():void {
b1.addEventListener(MouseEvent.CLICK,clickListener);
}
public function clickListener(e:MouseEvent, a:String):void { ... }
</mx:Script>
<mx:Button id="b1"/>
手动dispatch事件
可以通过组件的dispatchEvent方法手动派发事件
事件传播
当事件产生以后,有3个阶段,按照如下顺序进行
capturing
targeting
bubbling
capturing phase(捕获阶段)
在捕获阶段,flex检测显示列表中事件祖先,看那个注册了事件监听,flex从根组件开始,逐级遍历显示列表到直接目标对象
在大多数情况下,根组件主要是Stage,SystemManager,Application,
例如,如果你有一个包含TitleWindow容器的Panel容器,结果如下
application
pannel
TitleWindow
Button
当在button上发生click事件时,将发生如下步骤
1、检查application的click事件监听器
2、检查panel的click事件监听其
3、检查TitleWindow的click事件监听
当捕获阶段,flex更换currentTarget属性到当前的节点,current属性关联到事件对象
缺省的在捕获阶段,容器没有监听,缺省的use_capture参数是false,唯一一个方式就是在addEventListener的时候传递
参数为true
myPanel.addEventListener(MouseEvent.MOUSE_DOWN,clickHandler,true);
如果你在mxml中定义,采用默认的false,无法修改
targeting阶段
在定位阶段,flex执行事件派发
bubbling阶段
在bubbling阶段,flex执行事件的祖先,flex派发直接父类,继续到根空间,这个也捕获相反
3、创建一个事件处理类,将组件注册到事件处理类上
探索实践的结构
你可以决定拟使用时间的那个阶段,采用eventPhase属性,这个属性包含了下面的int值
1 - capturing phase(CAPTURING_PHASE)
2 - Targeting phase(AT_TARGET)
3 - Bubbling phase(BUBBLING_PHASE)
事件优先级
一个事件你可以注册多次,flex注册的顺序是通过addEventListener的顺序调用的
addEventListener的第四个参数就是优先级,默认为0,首先执行高的,然后执行低的
使用子类
按键事件