| ActionScript 3.0 のプログラミング > Flash Player API > イベントの処理 > イベントオブジェクト | |||
新しいイベント処理システムにおいて、イベントオブジェクトには主として 2 つの用途があります。1 つは、具体的な個々のイベントを表現し、当該イベントに関する情報を各種プロパティに格納することです。もう 1 つは、各種メソッドを使用してイベントオブジェクトを操作し、イベント処理システムの動作を変化させることです。
それらのプロパティとメソッドにアクセスしやすいよう、Flash Player API には、イベントオブジェクトすべての基本クラスとなる Event クラスが定義されています。Event クラスは、すべてのイベントオブジェクトに共通する基本的なプロパティとメソッドを備えています。
このセクションでは、まず Event クラスのプロパティと、次に Event クラスのメソッドについて順に説明し、最後に、Event クラスにサブクラスが存在する理由について説明します。
Event クラスには、イベントオブジェクトに関する重要な情報を提供する多数の読み取り専用プロパティと定数があります。次のプロパティは特に重要です。
Event.type プロパティに格納されます。Event.cancelable プロパティに格納されます。すべてのイベントオブジェクトには、それぞれイベントタイプが設定されます。イベントタイプはストリング値として Event.type プロパティに格納されます。コードでイベントオブジェクトのタイプを知ることができると、タイプに応じてオブジェクトの処理方法を区別できて便利です。たとえば、次のコードでは、myDisplayObject に渡されるマウスクリックのイベントオブジェクトすべてに対して clickHandler() リスナー関数が応答するように指定しています。
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler)
Event クラス自体に関連付けられ、Event クラス定数によって表されるイベントタイプの数は 20 種類を超えます。それらの一部について、Event クラス定義から抜粋した次のコードに示します。
package flash.events
{
public class Event
{
// クラス定数
public static const ACTIVATE:String = "activate";
public static const ADDED:String = "added";
// その他の定数は省略
}
}
これらの定数を使用すると、特定のイベントタイプを簡単に参照できます。各定数が表すストリングを直接に使用することは避け、定数名で参照するようにしてください。コードに入力した定数名にスペルミスがあった場合はコンパイラによって検出できます。しかし、ストリングの値にスペルミスがあった場合はコンパイル時のエラーとならず実行時に予期しない動作が生じ、困難なデバッグ作業が必要となる可能性があります。たとえば、イベントリスナーを登録する際は次のようなコードを使用してください。
myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);
次のコードはお勧めできません。
myDisplayObject.addEventListener("click", clickHandler);
コードで cancelable プロパティを調べると、特定のイベントオブジェクトに対するデフォルト動作をキャンセルできるかどうか知ることができます。cancelable プロパティの値は Boolean 型で、デフォルト動作に対するキャンセルの可否を示します。デフォルト動作のキャンセルが可能なイベントは少数ですが、該当する場合は、関連付けられた動作を preventDefault() メソッドで無効化できます。詳細については、イベントのデフォルト動作のキャンセルを参照してください。
Event クラスの他のプロパティには、次に示すとおり、イベントオブジェクト自体やイベントフローとの関係に関する重要な情報が格納されます。
bubbles プロパティは、そのイベントオブジェクトの伝達経路となるイベントフローの構成要素に関する情報を含みます。 eventPhase プロパティは、イベントフローが現在どの段階にあるかを示します。 target プロパティは、イベントターゲットへの参照です。 currentTarget プロパティは、当該イベントオブジェクトを現在処理している表示リストオブジェクトへの参照です。イベントオブジェクトがバブリング段階にあるとき、そのオブジェクトによって表されるイベントは "浮上" 中、つまり、ターゲットノードからステージへと階層の上位に向かって戻る経路の途中にあります。Event.bubbles プロパティには、そのイベントオブジェクトがバブリング段階を経由するかどうかを示す Boolean 値が格納されます。バブリングの対象となるイベントは、必ずキャプチャ段階とターゲット段階の対象にもなるので、イベントフローの 3 段階すべてを経ることになります。このプロパティの値が true の場合、当該イベントオブジェクトは 3 つの段階をすべて経由します。値が false の場合、当該イベントオブジェクトはバブリング段階を経由しません。
eventPhase プロパティを調べると、そのイベントオブジェクトがイベントのどの段階にあるかを知ることができます。eventPhase プロパティには、イベントフローの 3 つの段階いずれかを示す符号なし整数値が格納されます。次に示すコードの抜粋にあるとおり、Flash Player API には、それらの符号なし整数値に対応する 3 つの定数を含んだ EventPhase クラスが別途定義されています。
package flash.events
{
public final クラス EventPhase
{
public static const CAPTURING_PHASE:uint = 1;
public static const AT_TARGET:uint = 2;
public static const BUBBLING_PHASE:uint = 3;
}
}
これらの定数は、eventPhase プロパティにおいて有効な 3 つの値に対応します。定数を使用すると、コードの読みやすさを向上できます。たとえば、イベントオブジェクトがターゲット段階にある場合のみ myFunc() という関数を呼び出すようにするには、次のようなコードで条件を判断します。
if (e.eventPhase == EventPhase.AT_TARGET)
{
myFunc();
}
target プロパティには、当該イベントのターゲットであるオブジェクトへの参照が格納されます。ターゲットの扱いは単純な場合とそうでない場合があります。たとえば、マイクがアクティブになったことを示すイベントでは、イベントオブジェクトのターゲットは Microphone オブジェクトであることが明確です。しかし、ターゲットが表示リスト内にある場合は、表示リストの階層構造を考慮する必要があります。たとえば、複数の表示リストオブジェクトの重なり合う地点がユーザーによってマウスでクリックされた場合、Flash Player では、ステージから最も遠い階層にあるオブジェクトがイベントターゲットとして選ばれます。
複雑な SWF ファイルでは、target プロパティがうまく機能しないことがあります。各ボタンに対して子オブジェクトを使用した定型的な修飾処理が施されているような場合は、target プロパティの参照先がボタンではなく修飾用の子オブジェクトになってしまう状況が発生しやすいためです。このような状況では、ボタンにイベントリスナーを登録し、currentTarget プロパティを使用するのが一般的です。そうすれば、target プロパティが子オブジェクトを参照してしまう場合にも currentTarget プロパティでボタンを参照できます。
currentTarget プロパティには、当該イベントオブジェクトを現在処理している表示リストオブジェクトへの参照が格納されます。調べる対象のイベントオブジェクトが現在どのノードで処理されているかが事前にわかっていないとは奇妙な状況のようにも聞こえますが、実際は特別なことではありません。なぜなら、当該イベントオブジェクトのイベントフローに含まれる任意の表示オブジェクトにリスナー関数が登録されている可能性があり、また、リスナー関数自体が任意の場所に配置されている可能性があるからです。さらに、1 つのリスナー関数が複数の表示オブジェクトに登録されている場合もあります。プロジェクトの規模が大きくなり、複雑さが増すにつれて、currentTarget プロパティの有用性は高まります。
Event クラスのメソッドは、次の 3 種類に大別されます。
Event クラスには 2 つのユーティリティメソッドがあります。clone() メソッドは、イベントオブジェクトのコピーを作成します。toString() メソッドは、イベントオブジェクトの各種プロパティとそれらの値を表すストリング表現を生成します。いずれのメソッドもイベントモデルシステムの内部で使用されているものですが、アプリケーション開発者にも一般用途向けに公開されています。
上級開発者が Event クラスのサブクラスを作成する場合は、イベントサブクラスを正常に機能させるために、両方のユーティリティメソッドをオーバーライドして独自のバージョンを実装する必要があります。
イベントオブジェクトがイベントフローで処理されるのを停止するには、Event.stopPropogation() メソッドまたは Event.stopImmediatePropogation() メソッドを呼び出します。これら 2 つのメソッドはほとんど同じですが、現在のノードに登録されている残りのイベントリスナーについて実行を許可するかどうかという点のみが異なります。
Event.stopPropogation() メソッドを呼び出すと、当該イベントオブジェクトがイベントフローで次のノードに伝達されるのを防ぐことができます。ただし、現在のノードに登録されているイベントリスナーはすべて実行されます。Event.stopImmediatePropogation() メソッドを呼び出すと、当該イベントオブジェクトがイベントフローで次のノードに伝達されるのを防ぎ、また、現在のノードに登録されている他のイベントリスナーの実行も防ぐことができます。いずれのメソッドを呼び出した場合も、イベントに関連付けられているデフォルト動作が実行されるかどうかには影響しません。デフォルト動作をキャンセルするには、Event クラスのデフォルト動作メソッドを使用する必要があります。
デフォルト動作のキャンセルに関しては、preventDefault() メソッドと isDefaultPrevented() メソッドの 2 つがあります。preventDefault() メソッドを使用すると、イベントに関連付けられたデフォルト動作をキャンセルできます。既に preventDefault() を呼び出したかどうかを確認するには、isDefaultPrevented() メソッドを使用します。呼び出し済みの場合は戻り値として true が返され、まだ呼び出していない場合は false が返されます。
preventDefault() メソッドは、デフォルト動作のキャンセルが可能であるイベントに対してのみ使用できます。キャンセルの可否については、API ドキュメントで該当するイベントタイプの項目を参照するか、ActionScript で当該イベントオブジェクトの cancelable プロパティを確認してください。
デフォルト動作をキャンセルしても、イベントフローによるイベントオブジェクト処理の進行には影響しません。イベントオブジェクトをイベントフローから取り除くには、イベントフローメソッドを使用する必要があります。
多くのイベントは、Event クラスに定義されている共通のプロパティセットを使用すれば十分に表現できます。しかし、Event クラスのプロパティでは表現できない独特の性質を持ったイベントもあります。そのようなイベントのために、Flash Player API には Event クラスのサブクラスがいくつか定義されています。
各サブクラスには、そのイベントのカテゴリに特有のプロパティおよびイベントタイプが追加されています。たとえば、マウスの入力に関するイベントには、Event クラスに定義されているプロパティでは表現できない独特の性質があります。MouseEvent クラスは、Event クラスを拡張し、マウスイベントの発生位置や、発生時に特定のキーが押されていたかどうかなどの情報を格納するプロパティを追加したものです。
また、Event のサブクラスには、当該サブクラスに関連付けられたイベントタイプを表す定数が格納されます。たとえば MouseEvent クラスの場合、マウス関連のイベントタイプである click、doubleClick、mouseDown、mouseUp を表す定数がそれぞれ定義されています。
Event クラスのユーティリティメソッド で説明したとおり、Event クラスを作成するときは、clone() および toString() メソッドをオーバーライドして、サブクラスに固有の機能を提供する必要があります
Flex 2.01