Posted on 2012-10-18 10:30
誰(shuí)用我名字啦? 閱讀(1933)
評(píng)論(0) 編輯 收藏 所屬分類:
flex學(xué)習(xí)之路
自定義事件只是一個(gè)"特別"的ActionScript類。開發(fā)者創(chuàng)建自定義事件無(wú)外乎完成如下幾個(gè)任務(wù):繼承flash.events.Event、定義事件屬性、編寫類構(gòu)造器、重載clone方法。
一 繼承Event帶參數(shù)自定義事件
1.創(chuàng)建AS事件類SwitchLightEvent


package CustomTraficLight.events
{
import flash.events.Event;
import mx.controls.Alert;
public class SwitchLightEvent extends Event
{
public static var SWITCH:String = "SwitchLightEvent";
private var selectedLight:String;
public function SwitchLightEvent(type:String, val:String)
{
super(type);
selectedLight = val;
}
override public function clone():Event{
return new SwitchLightEvent(type, selectedLight);
}
public function getSelectedLight():String {
return selectedLight;
}
}
} 2.創(chuàng)建事件觸發(fā)組件LightConsole


<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="300" height="30">
<fx:Declarations>
</fx:Declarations>
<fx:Metadata>
[Event(name="SwitchLightEvent", type="CustomTraficLight.events.SwitchLightEvent")]
</fx:Metadata>
<fx:Script>
<![CDATA[
import CustomTraficLight.events.SwitchLightEvent;
import mx.controls.Alert;
private function clickEventHandler(varSelectedLight:String):void{
dispatchEvent(new SwitchLightEvent(SwitchLightEvent.SWITCH, varSelectedLight));
}
]]>
</fx:Script>
<mx:Button id="btnGreen" label="綠色" click="clickEventHandler('綠色')"/>
<mx:Button id="btnRed" label="紅色" click="clickEventHandler('紅色')"/>
<mx:Button id="btnBlue" label="藍(lán)色" click="clickEventHandler('藍(lán)色')"/>
</mx:HBox> 3.創(chuàng)建應(yīng)用CustomTraficLight


<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:views="CustomTraficLight.views.*"
minWidth="955" minHeight="600"
creationComplete="init()" >
<fx:Script>
<![CDATA[
import CustomTraficLight.events.SwitchLightEvent;
import mx.controls.Alert;
private function init():void{
lc.addEventListener(SwitchLightEvent.SWITCH,clickHandler);
}
private function clickHandler(event:SwitchLightEvent):void{
Alert.show(event.getSelectedLight());
}
]]>
</fx:Script>
<views:LightConsole x="0" y="30" id="lc"/>
<views:Lights x="0" y="0"/>
</s:Application>
創(chuàng)建自定義事件5個(gè)步驟1.使用ActionScript創(chuàng)建自定義事件
定義屬性
開發(fā)者通常希望"消息"能夠攜帶更多的信息,提供更多的數(shù)據(jù)。在自定義事件中,通過(guò)定義屬性,可以讓事件攜帶更多的信息。
編寫構(gòu)造器
類當(dāng)然離不開構(gòu)造器。事件類的構(gòu)造器要完成兩項(xiàng)任務(wù)。
(1). 調(diào)用Super()
通過(guò)Super()調(diào)用父類的構(gòu)造器,以初始化從父類繼承的屬性等。通常情況下,子類構(gòu)造器應(yīng)該首先調(diào)用Super()方法。當(dāng)然,如果沒有為子類編寫構(gòu)造器(不添加構(gòu)造器方法),編譯器會(huì)自動(dòng)添加一個(gè)構(gòu)造器,并且也會(huì)調(diào)用Super()。但是,我們?nèi)匀煌扑]編寫構(gòu)造器,并且顯式地調(diào)用Super()方法。
(2). 設(shè)置屬性
事件類型是最常用到的事件屬性。Super()可以接受String類型的參數(shù),由此設(shè)置父類事件中繼承來(lái)的事件類型屬性(event.type)。
除了事件類型外,事件的其他自定義屬性可以作為構(gòu)造器的參數(shù)傳入,在構(gòu)造器中完成初始化。更靈活的是,這些屬性類型不僅僅局限于String、Number等基本類型,還可以是任何自定義類。
重載clone方法
創(chuàng)建自定義事件的最后一步是重載父類的clone方法,返回新的Event對(duì)象。當(dāng)觸發(fā)事件時(shí),即dispatchEvent(event)時(shí),EventDispatcher會(huì)自動(dòng)調(diào)用clone方法獲取新的Event對(duì)象。
重載clone方法將復(fù)制自定義類的所有屬性。如果你沒有對(duì)自定義事件類中添加的所有屬性進(jìn)行賦值的話,那么當(dāng)偵聽器處理觸發(fā)的自定義事件時(shí),就不會(huì)獲得正確的屬性值。
2.使用元數(shù)據(jù)[Event]定義事件
通過(guò)[Event]元數(shù)據(jù),開發(fā)者可以為組件定義事件。編譯器能夠把這些自定義的事件識(shí)別為MXML標(biāo)簽屬性。使用[Event]既可以為ActionScript組件定義事件,也可以為MXML組件定義事件。
//[Event(name="eventName",type="package.eventType")]
//name說(shuō)明了事件的名稱,而type表明了該名稱對(duì)應(yīng)的事件類型。事件偵聽器使用name進(jìn)行注冊(cè)。
為ActionScript組件定義事件
//[Event]元數(shù)據(jù)必須置于包(package)定義之內(nèi),類(class)定義之上
package events{
[Event(name="sampleEvent", type="myEvents.SampleEvent")]
public class MyComponent extends UIComponent{
//
}
}
為MXML組件定義事件
<fx:Metadata>
[Event(name="SwitchLightEvent", type="CustomTraficLight.events.SwitchLightEvent")]
</fx:Metadata>
3.觸發(fā)事件
4.創(chuàng)建事件偵聽器