UIObject派生のコンポーネントには、addEventListerメソッドを使ってmouseOverやmouseDownなどのUI系のイベントリスナーを定義できます。
addEventListenerでイベント通知を受け取るようにすると、MovieClip#onRelease=function(){}の書き方の時のように、
後付けのイベントハンドラで既に定義済みのイベントを上書きすることがないため、大変便利です。
(どうしてもonなんとかの再定義はいる場合は、http://d.hatena.ne.jp/c9katayama/20070302#1172810517を参照)
ただし、普通にMovieClipを作っただけでは、このaddEventListener機能は使用できません。
addEventListenerは、mx.events.EventDispatcherクラスの機能を使用して実現されています。
このクラスはイベントのディスパッチ機能をObjectに対して付与する機能をもっており、staticメソッドinitializeメソッドにオブジェクトを渡すと、その機能が付与されます。
var obj:Object = new Object(); mx.events.EventDispatcher.initialize(obj); obj.addEventListener(・・・・イベントリスナーをつけるメソッド obj.dispatchEvent(・・・イベントを発生させ、リスナーへの通知を行うメソッド
このEventDispatcherクラスは単にディスパッチ機能を付与するだけですが、このクラスの派生クラスであるmx.events.UIEventDispatcherクラスを使用することにより、UI系のイベントディスパッチを行う機能を付与できます。
使い方はEventDispatcherと同じで、
var mc:MovieClip = createEmptyMovieClip(・・・ムービークリップを作る
mx.events.UIEventDispatcher.initialize(mc);
となります。
UIEventDispatcherで初期化すると、「load」「unload」「keyDown」「keyUp」のイベントに対してaddEventListenerすることが出来るようになります。
ただ、この4つのイベントだけではほとんど役に立たないと思います。通常使いたいのはおそらく「mouseUp」「mouseDown」「mouseOver」などのイベントでしょう。
これらのイベントは、mx.events.LowLevelEventsクラスでサポートされています。使い方は、次のような感じです。
var mc:MovieClip = createEmptyMovieClip(・・・ムービークリップを作る
mx.events.LowLevelEvents;
mx.events.UIEventDispatcher.initialize(mc);
UIEventDispatcher.initializeを呼ぶ前に、LowLevelEvntsクラスを書いておくだけです。
これでmouseMove,mouseDown,mouseUp,mouseOver,mouseOut,mouseDownSomewhere,mouseUpSomewhereのイベントが受け取れるようになります。
mx.events.LowLevelEventsクラスは、そのクラスが呼ばれた瞬間にstaticイニシャライザが動き、UIEventDispatcherクラスに
定義を追加します。これにより、UIEventDispatcher.initializeが呼ばれた時にこれらmouse系のイベントが追加されるという訳です。
AS2ではコンポーネントがそこそこ発達していますが、もしMovieClipでボタンなんかを作る場合は、ムービークリップの先頭に
mx.events.LowLevelEvents;
mx.events.UIEventDispatcher.initialize(this);
と書いておくだけでイベントディスパッチャーが使えるので、覚えて置いて損はないでしょう。
またFlex2ではイベントディスパッチで処理を進めていくという実装がメインになるので、AS2でもその実装に慣れておくのはいいと思います。