アクセシビリティ
デベロッパーリソース

目次

ActionScript 3.0のイベント処理について

Eventプロパティ

一般的なEventプロパティの基本的な内容は以下のとおりです。

  • type:String
  • eventPhase:uint
  • bubbles:Boolean
  • cancelable:Boolean
  • target:Object
  • currentTarget:Object

この他のプロパティはサブクラスに適用されます。例えば、MouseEventインスタンスには、特に現在のイベントに関連する表示オブジェクト(現在のroll overイベントに到達するために通過した表示オブジェクトなど)を記述するrelatedObjectプロパティなどもあります。

一部のプロパティは見覚えがあるでしょう。前述のプロパティについて、以下に説明します。

  • type:処理するイベントのタイプ。これは、関数をリスナーとして追加するためにaddEventListenerで使用する最初のパラメータと同じです。例えば、MouseEvent.CLICKなどです。
  • eventPhase:イベントの現在の段階。リスナーが呼び出されている段階に応じて、定数EventPhase.CAPTURING_PHASEEventPhase.AT_TARGETおよびEventPhase.BUBBLING_PHASEに関連する数値として指定されます。
  • bubbles:イベントがバブル(およびキャプチャ)するイベントであるかどうかを示します。これは、イベントがキャプチャ段階またはバブリング段階を通過したか、これから通過することを意味するのではなく、キャプチャ段階またはバブリング段階を通過する可能性のあるイベントであることを意味します。前の例でstageのみをクリックした場合は、stageが唯一のターゲットであったので、イベントのキャプチャまたはバブルは発生しませんでした。ただし、イベントはマウスクリックだったので、バブルはtrueのままです。
  • cancelable:イベントのキャンセルが可能かどうかを示します。キャンセル可能なイベントは、デフォルトでは、イベントハンドラ内で停止できる追加の結果を伴うことがあります。この例には、テキストフィールドにテキストを入力してそのフィールドに文字を追加する場合などがあります。デフォルトでは、キーボードのキーが押されるたびに文字がフィールドに追加されるか、その他のアクションが発生してテキストフィールドの内容が変更されます。テキストの入力イベント(TextEvent.TEXT_INPUT)をリッスンしているリスナーは、これらのイベントを認識し、デフォルトの動作をキャンセルできます。このような場合、cancelableプロパティの値はtrueになります。
  • target:イベントのターゲットであるオブジェクト。ターゲット段階でイベントを受け取るオブジェクトです。
  • currentTarget:イベントの発生時にリスナーによって現在呼び出されているオブジェクトを参照します。リスナーが追加されたときにaddEventListenerが呼び出されるオブジェクトと同じオブジェクトです。

これらのプロパティは、様々なイベントに対して実行する必要のあるアクションを特定する際に役立ちます。

例3:ActionScript 3.0スタイルのmouse up outsideイベント

ActionScript 3.0イベントの短所の1つに、ActionScript 2.0のonReleaseOutsideイベントに相当するイベントが存在しないことが挙げられます。ActionScript 3.0にはmouse downイベントとmouse upイベントはありますが、クリックしたオブジェクトの外でのイベントの解放を処理できるイベントはありません。オブジェクトがクリックされた後、オブジェクトの外でマウスが解放された場合を特定するには、stageに固有の動作を利用した回避策を使用する必要があります。

これを行うには、2つのアプローチがあります。最も簡単な方法は以下のとおりです。

  1. 目的のターゲットのmouse downを検出します。
  2. mouse downイベントハンドラで、mouse upのstageにリスナーを追加します。
  3. stageのmouse upリスナーで、Eventオブジェクトのtargetプロパティをチェックして、ターゲットがクリックされた元のオブジェクトであるかどうかを確認します。元のオブジェクトである場合は、元のターゲットでマウスが解放されています。元のオブジェクトでない場合は、オブジェクトの外でマウスが解放されています。
  4. mouse upリスナー内のstageリスナーを削除します。

stageではすべてのマウスイベントをキャプチャするので、すべてのmouse upイベントがstageに受け取られると見なすことができます。mouse upリスナーをターゲットオブジェクトのmouse downリスナー内のstageに追加することで、次にマウスが解放されたとき、クリックされた元のオブジェクトの上で行われたmouse upか、オブジェクトの外で行われたmouse upか(mouse up outsideイベント)がわかります。

Flash CS3 Professional ActionScript 3.0プレビューの使用

  1. 例2のコードサンプルを開きます。
  2. フレーム1のタイムラインスクリプトを次のスクリプトに置き換えます。

    function boxDown(event:MouseEvent):void {
       trace("box down");
       stage.addEventListener(MouseEvent.MOUSE_UP, boxUpOutside);
    }
    
    function boxUpOutside(event:MouseEvent):void {
       if (event.target != box) {
          trace("box up outside");
       }
       stage.removeEventListener(MouseEvent.MOUSE_UP, boxUpOutside);
    }
    
    box.addEventListener(MouseEvent.MOUSE_DOWN, boxDown);
    

Flex 2の使用

  1. 新しいFlex MXMLドキュメントを作成するか、例2のコードサンプルを編集します。
  2. 次の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 boxDown(event:MouseEvent):void {
                trace("box down");
                stage.addEventListener(MouseEvent.MOUSE_UP, boxUpOutside);
             }
    
             public function boxUpOutside(event:MouseEvent):void {
                if (event.target != box) {
                   trace("box up outside");
                }
                stage.removeEventListener(MouseEvent.MOUSE_UP, boxUpOutside);
             }
    
             public function initApp():void {
                box.addEventListener(MouseEvent.MOUSE_DOWN, boxDown);
             }
          ]]>
       </mx:Script>
       
       <mx:Canvas id="box" width="200" height="200" backgroundColor="#800000">
       </mx:Canvas>
       
    </mx:Application>
    

ムービーをテストし、boxをクリックします。マウスをboxの上に重ねたまま、クリックして解放してみます。次に、マウスをクリックしてドラッグし、カーソルをboxの外に置いてマウスボタンを解放してみます。boxをクリックすると「box down」と表示され、boxをクリックしてboxの外で解放すると「box down」と「box up outside」の両方が表示されます。Flash Playerウィンドウの外でマウスを解放した場合も「box down」と「box up outside」が表示されます(stageに関連付けられているmouse upイベントに固有の動作です)。