サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

EventDispatcher.addEventListener()メソッド

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(evt:Event):void

関数(function)名は任意である。

useCapture:Boolean (デフォルト = false) ― リスナーが実行されるのは、キャプチャーフェーズなのか、あるいはターゲットおよびバブリングフェーズなのかを指定する。useCapturetrueに設定すると、リスナーはイベントをキャプチャーフェーズのみで処理し、ターゲットおよびバブリングフェーズでは扱わない。useCapturefalseだと、リスナーはイベントをターゲットおよびバブリングフェーズのみで処理する。3つのフェーズすべてでイベントを受取るには、addEventListenerを2度呼出す。ひとつはuseCapturetrueに設定し、もうひとつはuseCapturefalseに設定する。

priority:int (デフォルト = 0) ― イベントリスナーの優先順位。優先度は、32ビット符号つき整数で指定する。数値が大きいほど、優先度は高くなる。優先度nのすべてのリスナーは、優先度n-1のリスナーより先に処理される。複数のリスナーが同じ優先度のときは、登録された順序で処理される。デフォルトの優先度は0である。

useWeakReference:Boolean (デフォルト = false) ― リスナーへの参照が強いか弱いかを指定する。強い参照(デフォルト)にすると、リスナーがガベージコレクションされない。弱い参照には、ガベージコレクションが働く[*2]

クラスレベルのメンバー関数(メソッド)は、ガベージコレクションの対象とはらない。したがって、クラスレベルのメンバー関数に対してuseWeakReferenceをtrueに設定しても、その関数がガベージコレクションされることはない。関数の入れ子になったリスナーに対してuseWeakReferenceをtrueに設定すると、その関数はガーベジコレクションにより消滅する。その入れ子の関数を参照(他の変数に格納)すれば、ガーベジコレクションの対象とはならず、消滅することはない。

戻り値 なし。
例外

ArgumentError ― 指定されたリスナーがfunctionではない。


[訳者注*1] 通常は、Eventクラスまたはそのサブクラスの定数を用います。

[訳者注*2] 「ガーベジコレクション」(garbage collection)とは、オブジェクトへの参照を管理して、すべての参照が消滅するとメモリを自動的に解放する仕組みです。

また、弱い参照のリスナーについては、akihiro kamijo「イベントリスナ(AS3)とガーベジコレクション」およびgskinner.com「AS3: Weakly Referenced Listeners」(英文)をご覧ください。

説明
イベントリスナーオブジェクトをEventDispatcherオブジェクトに登録して、リスナーにイベントの発生を知らせます[*3]。イベントリスナーは、ディスプレイリストのすべてのノードについて、指定したイベントとフェーズ、優先度で登録することができます。

イベントリスナーを正しく登録した後に、addEventListener()をさらに呼出してその優先度を変えることはできません。リスナーの優先度を変更するには、まずremoveListener()を呼出さなければなりません。そのうえで、そのリスナーをふたたび登録して、新たな優先順位を指定します。

リスナーを登録した後、さらに続けてaddEventListener()を呼出し、異なったtypeuseCaptureの値を指定すると、別個のリスナーとして登録される結果になりますので、ご注意ください。たとえば、まずリスナーをuseCapturetrueの設定で登録すると、そのリスナーはキャプチャーフェーズでのみイベントを検知します。そこでふたたび同じリスナーオブジェクトを用いてaddEventListener()を呼出し、ただしuseCapturefalseに設定すると、ふたつの異なったリスナーが作成されます。ひとつはキャプチャーフェーズで検知し、もうひとつはターゲットおよびバブリングフェーズを検知します。

イベントリスナーを、ターゲットフェーズまたはバブリングフェーズのどちらかのみに登録することはできません。これらのフェーズは、一緒に登録されます。なぜなら、バブリングというのが、ターゲットノードの上位に対してのみ適用されるものだからです。

もし、イベントリスナーがもはや不要になったときは、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■[シンボルプロパティ]ダイアログボックスで[クラス]を設定
Linkage Properties
[リンケージ]の[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日


Copyright © 2001-2009 Fumio Nonaka.  All rights reserved.