ActionScript3.0事件機制非常的完善
透過偵聽函式即可以得知廣播者發出的事件。
我們希望發件事件時, 能一起把自定的參數也發送出去
這時候就要自定一個類別來繼承Event。
自定一個名為LoaderEvent的類別。
定義靜態常數字串。
新增一個名為LoaderX類別繼承Loader
要偵聽Loader物件時
以前要寫
Loader實體.contentLoaderInfo.addEventListener(Event.COMPLETE,偵聽函式);
現在改成:
LoaderX實體.addEventListener(LoaderEvent.LOADER_COMPLETE,偵聽函式);
這樣就可以不需要再多打一個contentLoaderInfo
同時在偵聽事件時, 能再多接收參數。
SourceCodeDownload
透過偵聽函式即可以得知廣播者發出的事件。
我們希望發件事件時, 能一起把自定的參數也發送出去
這時候就要自定一個類別來繼承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
留言
現在的AS3.0的資料好少,買來的書也沒有類似的教學...3.0跟以前的語法差好多...真的看不懂...
不知道老師能不能教我呢?
我想做一個類似這樣網頁的紙娃娃FLASH,用AS3.0寫,
http://img.roiworld.com/data
/roigame/our/swf/ou024.swf
想做的是衣服可以自動卡位,
也可以讓使用者把自己設計的衣服上傳來放,
懇求給老師恩賜一個簡單的FLA+教學方向讓我去做>"<