ID: FN0608004 |
Platform: All |
Version: CS3/ActionScript 3.0 |
Runtime: Flash Player 9/AIR 1.0 |
EventDispatcherクラス |
パッケージ
|
flash.events
|
継承
|
EventDispatcher → Object
|
registerElements()メソッド |
文法
|
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
|
概要
|
イベントリスナーオブジェクトをEventDispatcherオブジェクトに登録して、リスナーにイベントの発生を知らせる。
|
引数
|
type:String ― イベントのタイプ[*1]。
listener:Function ― イベントを処理するリスナー関数(function)。この関数は、ただひとつの引数としてEventオブジェクトを受取る必要がある。そして、値は返さない。以下の例のとおりである。
関数(function)名は任意である。
useCapture:Boolean (デフォルト = false) ― リスナーが実行されるのは、キャプチャーフェーズなのか、あるいはターゲットおよびバブリングフェーズなのかを指定する。useCaptureをtrueに設定すると、リスナーはイベントをキャプチャーフェーズのみで処理し、ターゲットおよびバブリングフェーズでは扱わない。useCaptureがfalseだと、リスナーはイベントをターゲットおよびバブリングフェーズのみで処理する。3つのフェーズすべてでイベントを受取るには、addEventListenerを2度呼出す。ひとつはuseCaptureをtrueに設定し、もうひとつはuseCaptureはfalseに設定する。
priority:int (デフォルト = 0) ― イベントリスナーの優先順位。優先度は、32ビット符号つき整数で指定する。数値が大きいほど、優先度は高くなる。優先度nのすべてのリスナーは、優先度n-1のリスナーより先に処理される。複数のリスナーが同じ優先度のときは、登録された順序で処理される。デフォルトの優先度は0である。
useWeakReference:Boolean (デフォルト = false) ― リスナーへの参照が強いか弱いかを指定する。強い参照(デフォルト)にすると、リスナーがガベージコレクションされない。弱い参照には、ガベージコレクションが働く[*2]。
クラスレベルのメンバー関数(メソッド)は、ガベージコレクションの対象とはらない。したがって、クラスレベルのメンバー関数に対してuseWeakReferenceをtrueに設定しても、その関数がガベージコレクションされることはない。関数の入れ子になったリスナーに対してuseWeakReferenceをtrueに設定すると、その関数はガーベジコレクションにより消滅する。その入れ子の関数を参照(他の変数に格納)すれば、ガーベジコレクションの対象とはならず、消滅することはない。
|
戻り値
|
なし。
|
例外
|
ArgumentError ― 指定されたリスナーがfunctionではない。
|
説明
イベントリスナーオブジェクトをEventDispatcherオブジェクトに登録して、リスナーにイベントの発生を知らせます[*3]。イベントリスナーは、ディスプレイリストのすべてのノードについて、指定したイベントとフェーズ、優先度で登録することができます。
イベントリスナーを正しく登録した後に、addEventListener()をさらに呼出してその優先度を変えることはできません。リスナーの優先度を変更するには、まずremoveListener()を呼出さなければなりません。そのうえで、そのリスナーをふたたび登録して、新たな優先順位を指定します。
リスナーを登録した後、さらに続けてaddEventListener()を呼出し、異なったtypeやuseCaptureの値を指定すると、別個のリスナーとして登録される結果になりますので、ご注意ください。たとえば、まずリスナーをuseCaptureがtrueの設定で登録すると、そのリスナーはキャプチャーフェーズでのみイベントを検知します。そこでふたたび同じリスナーオブジェクトを用いてaddEventListener()を呼出し、ただしuseCaptureをfalseに設定すると、ふたつの異なったリスナーが作成されます。ひとつはキャプチャーフェーズで検知し、もうひとつはターゲットおよびバブリングフェーズを検知します。
イベントリスナーを、ターゲットフェーズまたはバブリングフェーズのどちらかのみに登録することはできません。これらのフェーズは、一緒に登録されます。なぜなら、バブリングというのが、ターゲットノードの上位に対してのみ適用されるものだからです。
もし、イベントリスナーがもはや不要になったときは、removeEventListener()を呼出して削除します。そうしないと、メモリの問題が生じるかもしれません。イベントリスナーに登録されたオブジェクトは、メモリから自動的に削除されることはありません。ガーベジコレクションは、まだ参照されているオブジェクトは削除しないからです。
EventDispatcherインスタンスを複製しても、インスタンスに加えたイベントリスナーは複製されません(新規に作成したノードがイベントリスナーを必要とする場合は、ノード作成後にリスナーを追加しなければなりません)。けれども、EventDispatcherインスタンスを移動したときは、設定されたイベントリスナーもインスタンスとともに移動します。
イベントリスナーをノードに登録するとき、そのノードでイベントが処理中だった場合には、そのイベントリスナーは現行フェーズでは呼出されません。バブリングフェーズのような、イベントフローのつぎのフェーズから呼出すことができます。
イベントリスナーをノードから削除するとき、そのノードでイベントが処理中だった場合には、そのリスナーは実行中のアクションからまだ呼出されます。リスナーを削除した後は、(後の処理で再登録されないかぎり)イベントリスナーがふたたび呼出されることはありません。
[訳者注*3] EventDispatcher.addEventListener()メソッドを用いた実用的なサンプルをご紹介します。以下のクラスMyButton(スクリプト001)は、MovieClipシンボルのリンケージに[クラス]として設定します。そのMovieClipインスタンスに対しては、ActionScript 1.0/2.0と同じスタイルで、onPressやonRelease、そしてonReleaseOutsideイベントハンドラメソッドが記述できます(後述スクリプト002)。
MovieClipシンボルに[クラス]を設定するには、[ライブラリ]でMovieClipシンボルをクリックしてから、オプションポップアップメニューで[プロパティ]を選択し、[シンボルプロパティ]ダイアログボックスを開きます。[リンケージ]の[ActionScript用に書き出し]のオプションにチェックをつけ、[クラス]フィールドにクラス名MyButtonを入力します(図001)。
図001■[シンボルプロパティ]ダイアログボックスで[クラス]を設定
[リンケージ]の[ActionScript用に書き出し]のオプションにチェックをつける
スクリプト001■クラスMyButton
// ActionScript 3.0クラス定義ファイル: MyButton.as
// MovieClipシンボルの[Class]に設定
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
public class MyButton extends MovieClip {
public var onPress:Function;
public var onRelease:Function;
public var onReleaseOutside:Function;
function MyButton() {
addEventListener(MouseEvent.MOUSE_DOWN, press);
}
function press(eventObject:MouseEvent):void {
callEvent(onPress, eventObject);
setMouseUp();
}
function release(eventObject:MouseEvent):void {
clearMouseUp();
callEvent(onRelease, eventObject);
}
function releaseOutside(eventObject:MouseEvent):void {
clearMouseUp();
callEvent(onReleaseOutside, eventObject);
}
function setMouseUp():void {
addEventListener(MouseEvent.MOUSE_UP, release);
stage.addEventListener(MouseEvent.MOUSE_UP, releaseOutside);
}
function clearMouseUp():void {
removeEventListener(MouseEvent.MOUSE_UP, release);
stage.removeEventListener(MouseEvent.MOUSE_UP, releaseOutside);
}
function callEvent(eventFunction:Function, eventObject:MouseEvent):void {
if (eventFunction is Function) {
// インスタンスへの参照を保持するためFunction.apply()メソッドを使用
eventFunction.apply(this, [eventObject]);
}
}
}
}
|
クラスMyButtonをテストするには、たとえばフレームアクションとして以下のスクリプトを記述します(スクリプト002)。タイムラインには、クラスMyButtonを設定したMovieClipインスタンスmy_mcを配置しておきます。[制御] > [ムービープレビュー]を実行して、MovieClipインスタンスにマウス操作を行うと、それに対応してonPressやonRelease、onReleaseOutsideのコールバック関数が呼出され、[出力]パネルに結果が表示されます。
スクリプト002■MyButtonクラスのテスト例
// タイムライン: _level0
// フレームアクション
// MyButtonクラスを設定したインスタンスmy_mcを配置
import flash.events.MouseEvent;
my_mc.onPress = function (eventObject:MouseEvent):void {
trace("onPress", eventObject);
}
my_mc.onRelease = function (eventObject:MouseEvent):void {
trace("onRelease", eventObject);
}
my_mc.onReleaseOutside = function (eventObject:MouseEvent):void {
trace("onReleaseOutside", eventObject);
}
|
|
出典
[Flash CS4 Professional ActionScript 3.0 Language Reference] > [EventDispatcher] > [addEventListener() method]
参考
[ActionScript 3.0言語およびコンポーネントリファレンス] > [EventDispatcher] > [addEventListener()メソッド]
akihiro kamijo「EventDispatcherクラス」
作成者: 野中文雄
更新日: 2009年8月27日 Flash CS4 Professionalの[Help]をもとに、体裁を含めて大幅に改訂。
更新日: 2006年11月14日 スクリプト001のコールバック関数呼出しにFunction.apply()メソッドを使用する処理に変更。
更新日: 2006年9月19日 スクリプト001のクラスMyButton定義で、イベントハンドラメソッド設定用のプロパティに、パッケージ外からアクセスできるようpublic属性を指定。
作成日: 2006年8月21日