[PR]子育てママさんへ:3年毎に15万円うけとれる保険?





イベントディスパッチャーとは?




■ EventDispatcher とは?

事前に関数を登録しておくと、マウスを動かしたり、キーボードを押したりといったイベントが発生したときに FlashPlayer がその関数を呼び出してくれます。



Object
↓派生
EventDispatcher


関連のあるクラス(主なクラスを抜粋)
Stage , MovieClip , Sprite , Button , TextField , Bitmap , Video , Loader , Shape , root







関数を登録してイベントの通知を受け取る




■関数を登録してイベントの通知を受け取る


イベントが発生したときに実行してほしい関数を登録するには、 addEventListener を使用します。


EventDispatcher.addEventListener ("イベントの種類" , 関数 , キャプチャーを使用するか , 優先度 , 参照レベル );
第01引数 イベントの種類
第02引数 実行される関数
第03引数(略可)true = キャプチャー段階で実行、false = ターゲット,バブリング段階で実行
第04引数(略可)優先度 (0 〜 ) 大きいほど先に実行される
第05引数(略可)参照の強さ true = 強 、false = 弱
返り値 なし


■第01引数 イベントの種類

使用できるイベントの種類は呼び出すクラスにより変わります。


■第02引数 実行される関数

呼び出されるコールバック関数は、パラメータとしてイベントオブジェクトが渡されるので、第01引数で Event 型のオブジェクトを受け取れる関数を用意します。

Event オブジェクトの target プロパティから、どのインスタンスから呼びだされたかを知ることができます。(例外あり)


どのインスタンスのイベントが呼び出されたか調べる

function EnterFrameFunc(event : Event){
	trace(event.target);
}




■第03引数 キャプチャ段階で実行するか

true にするとキャプチャ段階で実行されます。false にするとターゲット、バブリング段階で実行されます。どちらも実行したい場合は、addEventListener メソッドをもう一度呼び出して第03引数を変更して2回登録します。



■第04引数 優先度

関数が実行される順番を 0 以上の数値で指定します。数値が高いほど先に実行されます。同じ数値がすでに登録済みの場合、後に登録したほうが優先度が高くなります。

一度登録された関数の優先度を変更する場合は removeEventListener() メソッドで登録を外してから再登録します。


■第05引数 参照レベル

true に設定すると強参照となりガベージコレクションの対象になりません。false に設定すると弱参照となりガベージコレクションの対象になります。通常 false にします。

参照レベルを強にした場合、removeEventListener()メソッドを使って関数の登録を外した時にインスタンスが何処からも参照されなくなったとしても破棄されないようです。メモリリークに注意してください。





毎フレーム実行される関数を登録する

function EnterFrameFunc(event){
	trace("呼び出された");
}

stage.addEventListener(Event.ENTER_FRAME ,EnterFrameFunc);








関数の登録を外してイベント通知を止める




■関数の登録を外してイベント通知を止める


イベントディスパッチャーに登録した関数を外すには、 removeEventListener を使用します。 このメソッドを使用するには、登録した関数とイベントの種類のパラメータが必要になります。


EventDispatcher.removeEventListener ( "イベントの種類" , 関数 , キャプチャーを使用するか);
第01引数 登録時に指定したイベントの種類
第02引数 登録時に指定した関数
第03引数(略可)登録時に指定したキャプチャー状態 (Boolean)
返り値 なし


登録した関数を外す

function EnterFrameFunc(event){
	trace("呼び出された");
}

stage.addEventListener(Event.ENTER_FRAME ,EnterFrameFunc);
stage.removeEventListener(Event.ENTER_FRAME);





イベントディスパッチャーに無名関数を渡して登録した場合、破棄するときは関数の中で arguments.callee をパラメータにして removeEventListener を呼び出すと破棄出来るそうです。


無名関数で登録したときは、arguments.callee をパラメータにして破棄できる

stage.addEventListener(Event.ENTER_FRAME ,function (event){
	trace("呼び出された");

	stage.removeEventListener(Event.ENTER_FRAME ,arguments.callee);
});








クロージャを使って関数にパラメータを保持する




■クロージャを使って関数にパラメータを保持する


ローカル変数を宣言している関数内で新しく関数を動的に作成すると、 ローカル変数をすべて保持する関数を作れます。引数から渡される変数もローカル変数なのでそのまま保持できます。


ローカル変数が保持される(関数生成時の環境にアクセスできる)

function FuncCreate(param) {
	var test1 = 1;
	var test2 = 2;

	return function() {
		trace(param);
		trace(test1);
		trace(test2);
	}
}

var func = FuncCreate(0);    // 関数を動的に作成
func();                      // その関数を呼び出し





これを利用すれば、イベントに渡す関数にパラメータを持たせる事ができます。


イベントリスナー登録時にクロージャを使ってパラメータを渡す

var param = {
	path : this,    // 登録場所
	count : 0       // カウンタ
};
stage.addEventListener (Event.ENTER_FRAME,EnterFrameFunc(param));
function EnterFrameFunc (obj) {
	return function (event){
		trace("登録場所:"+obj.path);
		trace("カウンタ:"+obj.count);
		obj.count ++;
	}
}











[PR]三井住友海上きらめき生命:医療保険のご案内と資料請求はこちらから