跳到主要內容

AS3 自定事件

ActionScript3.0事件機制非常的完善
透過偵聽函式即可以得知廣播者發出的事件。
我們希望發件事件時, 能一起把自定的參數也發送出去
這時候就要自定一個類別來繼承Event。
自定一個名為LoaderEvent的類別。
定義靜態常數字串。


package milkmidi.events{ 
import flash.events.Event; 
public class LoaderEvent extends Event  {  
public static const LOADER_COMPLETE :String = "loaderComplete";
public static const LOADER_PROGRESS :String = "loaderProgress";
public static const LOADER_ERROR :String = "loaderError";
public var percentage:Number = 0;  
public function LoaderEvent(p_type:String , p_percentage:Number = 0) {   
super( p_type );   
this.percentage = p_percentage;
}   
}
}

新增一個名為LoaderX類別繼承Loader
package milkmidi.display{  
import flash.display.Loader;  
import flash.events.Event; 
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent; 
import milkmidi.events.LoaderEvent;

public class LoaderX extends Loader   {       
public function LoaderX() { 
super();         
this.contentLoaderInfo.addEventListener(Event.COMPLETE, _innerOnComplete, false, 0, true);
this.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, _innerOnProgress, false, 0, true);
this.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _innerOnIOError, false, 0, true);   
}    
override public function load(p_url:URLRequest, p_context:LoaderContext = null):void {   
throw new Error("EEEEEEERRRORROOROROR");
}
public function loadURL(p_url:String, p_context:LoaderContext = null):void  {     
super.load(new URLRequest(p_url), p_context);   
}   
private function _innerOnComplete(e:Event): void {     
this.dispatchEvent(new LoaderEvent(LoaderEvent.LOADER_COMPLETE));
//載入完成時, 發送自定的LoaderEvent.LOADER_COMPLETE事件。
}
private function _innerOnProgress(e:ProgressEvent):void{   
var percentage:int =  int(e.bytesLoaded / e.bytesTotal * 100);      
this.dispatchEvent(new LoaderEvent(LoaderEvent.LOADER_PROGRESS, percentage));   
//載入進行中, 發送自定的LoaderEvent.LOADER_PROGRESS事件。
//發發事件時, 也把參數percentage發送出去。
}
private function _innerOnIOError(e:IOErrorEvent):void{   
this.dispatchEvent(new LoaderEvent(LoaderEvent.LOADER_ERROR));
}  
}
}

測試:
package  {
import flash.display.Sprite; 
import milkmidi.display.LoaderX;
import milkmidi.events.LoaderEvent;
public class Demo extends Sprite{  
private var _ldr:LoaderX;
public function Demo() {
_ldr = new LoaderX();
_ldr.addEventListener(LoaderEvent.LOADER_COMPLETE, onLoaderComplete);
_ldr.addEventListener(LoaderEvent.LOADER_PROGRESS, onLoaderProgress);
//因為我們自定的LoaderX是繼承Loader, 擁有Loader類別所有的方法和屬性。
//同時我們擴充該類別, 讓他會發出LoaderEvent事件, 所以要改為偵聽LoaderEvent事件。
_ldr.loadURL("demo.jpg");
this.addChild(_ldr);
}

private function onLoaderComplete(e:LoaderEvent):void {
trace(e);
}

private function onLoaderProgress(e:LoaderEvent):void {
trace(e.percentage);
//接收到事件時, e物件會有percentage屬性。
//直接就是載入的百入比值。
}  
} 
}
建構一個LoaderX物件,來取代Loader
要偵聽Loader物件時
以前要寫
Loader實體.contentLoaderInfo.addEventListener(Event.COMPLETE,偵聽函式);
現在改成:
LoaderX實體.addEventListener(LoaderEvent.LOADER_COMPLETE,偵聽函式);
這樣就可以不需要再多打一個contentLoaderInfo
同時在偵聽事件時, 能再多接收參數。

SourceCodeDownload

留言

jerry寫道…
很棒的範例,感謝您
有幸搜尋到奶老師的教學網址,

現在的AS3.0的資料好少,買來的書也沒有類似的教學...3.0跟以前的語法差好多...真的看不懂...

不知道老師能不能教我呢?

我想做一個類似這樣網頁的紙娃娃FLASH,用AS3.0寫,

http://img.roiworld.com/data
/roigame/our/swf/ou024.swf

想做的是衣服可以自動卡位,

也可以讓使用者把自己設計的衣服上傳來放,


懇求給老師恩賜一個簡單的FLA+教學方向讓我去做>"<