EventListenerのaddとremoveをエレガントに管理

EventListenerMngというクラスを公開します。
イベントの後片付け(removeEventListener)が楽ちんに。

例えばstageに対するイベントを管理したいとき、インスタンスを一つnew。
var evtLisMng:EventListenerMng = new EventListenerMng();


オブジェクトにaddEventListenerを委託し、メイン処理を。
//	これを
// stage.addEventListener(KeyboardEvent.KEY_DOWN, fnc);
// stage.addEventListener(MouseEvent.MOUSE_DOWN, fnc);

// こう書く
evtLisMng.add(stage, KeyboardEvent.KEY_DOWN, fnc);
evtLisMng.add(stage, MouseEvent.MOUSE_DOWN, fnc);

function fnc(e:Event):void {ごにょごにょ}


アプリ終了時など、イベントの後片付けをしたい時。
以下のように書くだけ! アラ簡単。
evtLisMng.clear();
evtLisMng = null;

これでremoveEventListenerをずらずら並べたり、
関数参照を変数にとって置かなくて済みます。


EventListenerMng.as
package com.fc2.blog38.famibee.manager {
import flash.events.IEventDispatcher;

public final class EventListenerMng {
private var vctEvt :Vector.<Function> = new Vector.<Function>();

public function add(ed:IEventDispatcher, type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void {
ed.addEventListener(type, listener, useCapture, priority, useWeakReference);
vctEvt.push(function ():void {
ed.removeEventListener(type, listener, useCapture);
});
}

public function clear():void {
const len:uint = vctEvt.length;
for (var i:uint=0; i<len; ++i) vctEvt[i]();
vctEvt = new Vector.<Function>();
}
};
}



ちなみにイベント発生したら即removeしたい場合は、
以下のように書けますね。
stage.nativeWindow.addEventListener(Event.CLOSING,
function (e:Event):void {
e.target.removeEventListener(e.type, arguments.callee);
ごにょごにょ
});
スポンサーサイト
プロフィール

ふぁみべぇ

Author:ふぁみべぇ
 →@famibee
 →メアド(四角を@に)

カテゴリ
リンク
検索フォーム
最新記事
月別アーカイブ