一般的なEventプロパティの基本的な内容は以下のとおりです。
type:StringeventPhase:uintbubbles:Booleancancelable:Booleantarget:ObjectcurrentTarget:Objectこの他のプロパティはサブクラスに適用されます。例えば、MouseEventインスタンスには、特に現在のイベントに関連する表示オブジェクト(現在のroll overイベントに到達するために通過した表示オブジェクトなど)を記述するrelatedObjectプロパティなどもあります。
一部のプロパティは見覚えがあるでしょう。前述のプロパティについて、以下に説明します。
addEventListenerで使用する最初のパラメータと同じです。例えば、MouseEvent.CLICKなどです。EventPhase.CAPTURING_PHASE、EventPhase.AT_TARGETおよびEventPhase.BUBBLING_PHASEに関連する数値として指定されます。TextEvent.TEXT_INPUT)をリッスンしているリスナーは、これらのイベントを認識し、デフォルトの動作をキャンセルできます。このような場合、cancelableプロパティの値はtrueになります。これらのプロパティは、様々なイベントに対して実行する必要のあるアクションを特定する際に役立ちます。
ActionScript 3.0イベントの短所の1つに、ActionScript 2.0のonReleaseOutsideイベントに相当するイベントが存在しないことが挙げられます。ActionScript 3.0にはmouse downイベントとmouse upイベントはありますが、クリックしたオブジェクトの外でのイベントの解放を処理できるイベントはありません。オブジェクトがクリックされた後、オブジェクトの外でマウスが解放された場合を特定するには、stageに固有の動作を利用した回避策を使用する必要があります。
これを行うには、2つのアプローチがあります。最も簡単な方法は以下のとおりです。
targetプロパティをチェックして、ターゲットがクリックされた元のオブジェクトであるかどうかを確認します。元のオブジェクトである場合は、元のターゲットでマウスが解放されています。元のオブジェクトでない場合は、オブジェクトの外でマウスが解放されています。stageではすべてのマウスイベントをキャプチャするので、すべてのmouse upイベントがstageに受け取られると見なすことができます。mouse upリスナーをターゲットオブジェクトのmouse downリスナー内のstageに追加することで、次にマウスが解放されたとき、クリックされた元のオブジェクトの上で行われたmouse upか、オブジェクトの外で行われたmouse upか(mouse up outsideイベント)がわかります。
フレーム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);
次の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イベントに固有の動作です)。