1.创建和分配普通事件
举例说明
OkayCancelGroup.mxml文件,定义一个组件。
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" >
<s:layout>
<s:HorizontalLayout/>
</s:layout>
<fx:Metadata>
[Event(name="userAccept",type="flash.events.Event")]//为此组件声明事件类型,不声明则组件不能监听userAccept类型事件
[Event(name="userCancel",type="flash.events.Event")]
</fx:Metadata>
<fx:Script>
<![CDATA[
protected function ok_clickHandler(event:MouseEvent):void
{
var e:Event = new Event("userAccept");//创建事件,以userAccept为类型
dispatchEvent(e);//分配事件
}
protected function cancel_clickHandler(event:MouseEvent):void
{
var e:Event = new Event("userCancel");//创建事件,以userCancel为类型
dispatchEvent(e);//分配事件
}
]]>
</fx:Script>
<s:Button id="ok" label="Ok" click="ok_clickHandler(event)" />
<s:Button id="cancel" label="Cancel" click="cancel_clickHandler(event)"/>
</s:Group>
两个按钮的click事件处理函数中新建了事件并且分配了事件。
组件使用并监听创建的事件的代码
<components:OkayCancelGroup id="okCancelGroup" left="219" bottom="22" userAccept="okCancelGroup_userAcceptHandler(event)" userCancel="okCancelGroup_userCancelHandler(event)"/>
在一个父组件的MXML文件定义如上,监听userAccept和userCancel事件,并定义相应处理函数。
2.自定义事件类
上面的例子使用Event时间类,能够自己定义的只有type(userAccept和userCancel),不能携带更多数据,只支持最基本的事件属性。
如果需要事件传递更多的数据,可以继承flash.events.Event类.
UserAcknowledgeEvent.as
package events
{
import flash.events.Event;
public class UserAcknowledgeEvent extends Event
{
public var timestamp:Date;
public function UserAcknowledgeEvent(type:String,timestamp:Date, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
this.timestamp = timestamp;
}
override public function clone():Event{
return new UserAcknowledgeEvent(type,timestamp);
}
}
}
UserAcknowledgeEvent继承于Event,多保存了一个事件的时间,使用方法流程和普通Event一样。
3.事件冒泡
如果想要自定义事件能够被组件的父组件捕获并处理,需要将事件的属性bubbles指定为true。这样事件就是个冒泡事件,能够被父组件捕获。
当然父组件也需要定义能够捕获的事件类型。上例中需要在父组件中加入:
<fx:Metadata>
[Event(name="userAccept",type="events.UserAcknowledgeEvent")]
[Event(name="userCancel",type="events.UserAcknowledgeEvent")]
</fx:Metadata>
然后在事件处理函数中dispatchEvent()。