ActionScript 3.0のイベント処理は、EventDispatcherクラスに大きく依存します。このクラスはActionScriptで以前から使用されていますが、今回初めてActionScript言語の主要なクラスに含まれました。V2コンポーネントの使用時に、JavaScriptまたはActionScript 2.0のEventDispatcherを使用した経験がある方もいるでしょう。V2コンポーネントでは、EventDispatcherクラスの外部バージョンを使用してコンポーネントイベントを処理していました。このバージョンは、ActionScript 3.0の内部で使用されるEventDispatcherのバージョンとは若干異なります。
EventDispatcherについてご存じないユーザのために、基本的な概念をここで説明します。まず、様々なイベントに対応するための関数、すなわちイベントハンドラを作成します。これは、ActionScript 2.0における通常のコアプロセスと似ていますが(EventDispatcherは使用しません)、ActionScript 2.0ではイベントを受け取るオブジェクト内にイベントハンドラを定義し、受け取るイベントの名前を関数に指定する点が異なります。例えば、ActionScript 2.0でsubmitButtonという名前のボタンの「onPress」イベントに対応するには、次のように指定します。
submitButton.onPress = function() { ... }
EventDispatcherを使用する場合も、同じ要素(イベントを受け取るオブジェクト、イベント名、およびイベントに対応する関数)が関与しますが、プロセスだけ若干異なります。EventDispatcherを使用したコードは次のようになります。
function pressHandler(){ ... }
submitButton.addEventListener("onPress", pressHandler);
このプロセスでは余分な手順が追加されているように見えますが、それによって柔軟性が向上しています。ターゲットオブジェクト自体に直接イベントハンドラを定義する代わりに、関数を使用してイベントハンドラを追加しているので、1つのイベントを「リッスン」するハンドラをいくつでも追加できます。
ActionScript 2.0でのイベントの削除は、以下のように、ハンドラを削除することを意味していました。
delete submitButton.onPress;
EventDispatcherでは、removeEventListener()を使用します。このメソッドは、addEventListenerで使用されている定義(3番目のパラメータまで)に一致するイベントリスナーを削除します。
submitButton.removeEventListener("onPress", pressHandler);
上述のコードスニペットでは、EventDispatcherが明示的に参照されていないことに気づかれたことと思います。実のところ、コード内でEventDispatcherを直接使用することはまれです。ActionScript 3.0のEventDispatcherは、実際には基本クラスであり、他のクラスはこの基本クラスを拡張してaddEventListenerや他のEventDispatcherメソッドにアクセスします。ActionScript 2.0では、EventDispatcherはmixinクラスでした。
つまり、これらのメソッドを他のオブジェクトに渡すには、EventDispatcher.initialize()を使用してEventDispatcherから目的のオブジェクトにメソッドをコピーしていました。ActionScript 3.0では、EventDispatcherを拡張することでクラスがメソッドを継承します。便利なことに、MovieClipや他のDisplayObjectsなど、ActionScript 3.0でEventDispatcherを使用する必要があるほとんどのクラスで、すでにEventDispatcherが拡張されているので、アクセス可能であり、簡単に使用できるようになっています(ただし、上級ユーザはコードを作成してEventDispatcher機能を含めることもできます)。
ActionScript 3.0におけるEventDispatcherのメソッドを以下にまとめます。これらのメソッドの多くはActionScript 2.0バージョンのメソッドと類似しています。
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):voidremoveEventListener(type:String, listener:Function, useCapture:Boolean = false):voiddispatchEvent(event:Event):BooleanhasEventListener(type:String):BooleanwillTrigger(type:String):BooleanActionScript 2.0を使用した経験があれば、hasEventListenerおよびwillTriggerという2つの新しいメソッドに気づかれたでしょう。また、ActionScript 3.0のaddEventListenerでは、リスナーとして関数のみを使用でき、オブジェクトは使用できなくなりました(以前のバージョンではオブジェクトをリスナーとして使用できました)。ActionScript 3.0ではメソッドがそのインスタンスにバインドされるので、基本的にリスナーにオブジェクトを使用する必要がありません。つまり、関数内のthisキーワードは、取得先のインスタンスを常に正しく参照するようになりました。また、ActionScript 2.0のDelegateクラスを使用する必要もなくなりました。
addEventListenerを使用してリスナーリストに追加されたイベントハンドラを削除します。正しいハンドラを削除するには、addEventListenerで使用した最初の3つの引数と同じものをremoveEventListenerでも使用する必要があります。hasEventListenerとよく似ていますが、このメソッドでは現在のオブジェクトに加えて、イベントの伝達によって影響を受ける可能性のあるオブジェクトをすべてチェックします。これらのメソッドやActionScript 3.0言語の他の関数やメソッドについては、『ActionScript 3.0 リファレンスガイド』にも記載されています。
簡単な例として、画面上の「box」という四角形のインスタンスをクリックする場合を検討してみましょう(図1を参照)。この例の目的は、マウスでboxをクリックしたときに「click」というテキストが出力パネルでトレースされるようにイベントを処理することです。

図1.boxインスタンスをクリックすると、「click」という単語を出力パネルに表示
このテストムービーを作成するには、次の手順を実行します。
次のタイムラインスクリプトをフレーム1に追加します。
function clickHandler(event:MouseEvent):void {
trace("click");
}
box.addEventListener(MouseEvent.CLICK, clickHandler);
次のMXMLを使用します。
<?xml version="1.0" encoding="utf-8"?>
"mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="initApp()""
<mx:Script>
"![CDATA[
public function clickHandler(event:MouseEvent):void {
trace("click");
}
public function initApp():void {
box.addEventListener(MouseEvent.CLICK, clickHandler);
}
]]"
</mx:Script>
<mx:Canvas id="box" width="200" height="200" backgroundColor="#800000">
</mx:Canvas>
</mx:Application>
スクリプトを見てみましょう。最初の手順では、イベントハンドラ(リスナー関数)を定義します。すべてのイベントと同様に、これによって、イベントディスパッチャから呼び出されたときに関数に自動的に渡される1つのイベントインスタンスが、パラメータリスト内に配置されます。その後、関数はboxインスタンスのリスナー、つまり基本的なaddEventListener呼び出しを使用してMouseEvent.CLICKイベントをリッスンするイベントディスパッチャとして設定されます(これはFlexではinitAppメソッドで発生します)。boxはMovieClipのインスタンス(FlexではCanvas)なので、EventDispatcherから継承し、addEventListenerをはじめとするすべてのEventDispatcherメソッドにアクセスできます。
MouseEvent.CLICKは、MouseEventクラスで定義される定数で、イベントの文字列を指定し、MouseEvent.CLICKは、「click」になります。他のイベントタイプも、他のイベント関連クラスと同様に、MouseEventクラスの類似の定数に格納されます。これらの多くが、ActionScript 2.0の対応する項目と比べて変わっていることに注意してください。例えば、ActionScript 2.0ではonPressイベントを使用しますが、ActionScript 3.0ではMouseEvent.MOUSE_DOWN(または「mouseDown」)を使用します。これらの相違点に関する詳細は、イベントパッケージの『ActionScript 3.0 リファレンスガイド』と、パッケージ内のそれぞれのEventクラスに記載されています。
ここに示す例では、MouseEvent.CLICKの代わりに単に「click」を使用することもできますが、定数を使用することで、コード内のスペルミスを検出しやすくなります。例えば、文字列「click」のスペルを誤って入力しても、Flashには文字列の内容が正しいかどうかを判定する手段がないので、コンパイルエラーは発生しません。一方、MouseEvent.CLICKのスペルを誤って入力した場合は、Flashによってエラーが認識され、コンパイルエラーが発生します。ほとんどのEventクラスには、そのイベントタイプ文字列に関連するこれらの定数があります。そのため、実際の文字列をそのまま使用するのではなく、これらの定数を使用してください。
ムービーをテストすると、クリックできるboxが表示され、クリックすると、「click」という単語がトレースされます。
注意:FlexではムービーはDebugを使用してテストし、トレース出力をFlex Builderでキャプチャできるようにしてください。