イベントリスナーの使用

イベントリスナーとは、あるオブジェクトでブロードキャストしたイベントを別のオブジェクトで受け取れるようにするというものです。イベントが発生する側のオブジェクトをブロードキャスターオブジェクト、イベントを受け取る側のオブジェクトをリスナーオブジェクトと呼びます。ブロードキャスターオブジェクトは、ブロードキャスターが生成したイベントを受け取るリスナーオブジェクトを登録します。たとえば、ステージで発生した onResize の通知をムービークリップオブジェクトが受け取るように登録したり、テキストフィールドオブジェクトからの onChanged の通知をボタンインスタンスが受け取ることができます。また、1 つのブロードキャスターで発生したイベントを複数のリスナーオブジェクトが受け取るように登録したり、複数のブロードキャスターで発生したイベントを 1 つのリスナーオブジェクトが受け取るように登録することも可能です。

イベントハンドラメソッドと違って、イベント用のリスナー / ブロードキャスターモデルでは、コンフリクトを発生させずに複数のコードで同一イベントをリッスンできます。XML.onLoad() など、リスナーモデルまたはブロードキャスターモデルを使用しないイベントモデルでは、複数のコードが同一イベントをリッスンすると問題が発生する可能性があります。異なるコードが 1 つの XML.onLoad コールバック関数参照を制御しようとしてコンフリクトが発生するためです。リスナーモデルまたはブロードキャスターモデルを使うと、コードのボトルネックを心配せず、1 つのイベントに対して複数のリスナーを気軽に追加できます。

イベントをブロードキャストできる ActionScript クラスには、Key、Mouse、MovieClipLoader、Selection、Stage、TextField があります。クラスでどのリスナーが利用可能かについては、『ActionScript 2.0 リファレンスガイド』の各クラス項目を参照してください。

イベントリスナーの詳細については、次に示す各トピックを参照してください。

ブラウザウィンドウがサイズ変更されたときに Stage.scaleMode プロパティが Stage.width および Stage.height の値にどのように影響するかを示す、サンプルソースファイル "stagesize.fla" については、Flash サンプルページ (www.adobe.com/go/learn_fl_samples_jp) を参照してください。"Samples" zip ファイルをダウンロードし解凍して、"ActionScript2.0/StageSize" フォルダに移動してサンプルにアクセスします。

イベントリスナーモデル

イベントリスナーのイベントモデルは、イベントハンドラ (詳細についてはActionScript とイベントについてを参照) のモデルと似ていますが、次の 2 点が大きく違います。

次のコードは、イベントリスナーモデルの概略を表したものです。

var listenerObject:Object = new Object();
listenerObject.eventName = function(eventObj:Object) {
    // ここにコードを記述
};
broadcasterObject.addListener(listenerObject);

このコードは、オブジェクト listenerObject、プロパティ eventName から始まります。リスナーオブジェクトは任意のオブジェクトにすることができます。既存のオブジェクト、ムービークリップ、ステージ上のボタンのインスタンス、あるいは ActionScript クラスのインスタンスのいずれでも可能です。たとえば、カスタムムービークリップがステージリスナーのリスナーメソッドを実装できるとします。複数の種類のリスナーをリッスンするオブジェクトも可能です。

eventName プロパティは broadcasterObject で発生するイベントです。このイベントが listenerObject に対してブロードキャストされます。1 つのイベントのブロードキャスターに対して複数のリスナーを登録することも可能です。

続いて、イベントリスナーに対して、イベントに反応する何らかの処理を実行する関数を割り当てます。

最後に、ブロードキャスターオブジェクトの addListener() メソッドを呼び出してリスナーオブジェクトを渡します。

イベントの受け取りをやめるようにリスナーオブジェクトの登録を解除するには、ブロードキャスターオブジェクトの removeListener() メソッドを呼び出し、削除するイベントの名前およびリスナーオブジェクトを渡します。

broadcasterObject.removeListener(listenerObject);

イベントリスナーの例

次の例は、Selection クラスで onSetFocus イベントのイベントリスナーを使って、複数のテキスト入力フィールドのフォーカスを管理する簡単なフォーカスマネージャを作成する方法を示したものです。ここでは、キーボードフォーカスがあたったテキストフィールドのボーダーを有効に (表示) して、フォーカスのないテキストフィールドのボーダーを無効にしています。 

イベントリスナーを使って簡単なフォーカスマネージャを作成するには :

  1. テキストツールを使用して、テキストフィールドをステージに作成します。
  2. 作成したテキストフィールドを選択し、プロパティインスペクタで、[テキストの種類] ポップアップメニューから [テキスト入力] を選択し、[テキストの周囲にボーダーを表示] ボタンをクリックします。
  3. テキスト入力フィールドの下に、もう 1 つ別のテキスト入力フィールドを作成します。

    こちらのテキストフィールドは [テキストの周囲にボーダーを表示] オプションが選択されていないことを確認してください。テキスト入力フィールドの作成を続行できます。

  4. タイムラインでフレーム 1 を選択し、[アクション] パネルを開きます ([ウィンドウ]-[アクション])。
  5. 次のコードを [アクション] パネルに入力します。これは、Selection クラスからのフォーカス通知を受け取るオブジェクトを作成するコードです。
    // リスナーオブジェクト focusListener を作成する
    var focusListener:Object = new Object();
    // リスナーオブジェクトの関数を定義する
    focusListener.onSetFocus = function(oldFocus_txt:TextField, newFocus_txt:TextField) {
        oldFocus_txt.border = false;
        newFocus_txt.border = true;
    }
    

    このコードは、focusListener という名前のオブジェクトを作成します。このオブジェクトは、onSetFocus プロパティを定義し、このプロパティに関数を割り当てます。この関数は 2 つのパラメータを取ります。2 つのパラメータとは、フォーカスのないテキストフィールドへの参照と、フォーカスがあるテキストフィールドへの参照です。関数では、フォーカスのないテキストフィールドの border プロパティを false に、フォーカスがあるテキストフィールドの border プロパティを true に、それぞれ設定しています。

  6. 次のコードを [アクション] パネルに追加します。これは、Selection オブジェクトからイベントを受け取るように focusListener オブジェクトを登録するためのコードです。
    // ブロードキャスターを使用して focusListener を登録する
    Selection.addListener(focusListener);
    
  7. アプリケーションをテストします ([制御]-[ムービープレビュー])。最初のテキストフィールドをクリックし、Tab キーを押してフィールド間でフォーカスを移動します。

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000838.html