AS3覚え書き4:イベント
AS3では、イベントの仕組みはEventDispatcherクラスで定義されています。SpriteやMovieClipなど代表的なクラスは全てEventDispatcherクラスを継承しているのでイベント処理を行うことができます。
イベントリスナー
イベントを受け取るための処理をイベントリスナー、イベントを受け取った時に呼び出される関数をイベントハンドラと呼びます。イベントリスナーはaddEventListenerメソッドを利用して追加することができます。また引数にはイベント名(String型)とイベントハンドラを指定します。
var obj :Sprite = new Sprite(); obj.addEventListener(Event.ENTER_FRAME, onEnterFrame);
public function onEnterFrame(ev:Event):void { trace("onEnterFrame"); }
addEventListenerと対になるのがremoveEventListenerで、追加したリスナーを削除します。
obj.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
他にもイベントを送出するdispatchEventや特定のイベントに対応するリスナーを取得するhasEventListenerというメソッドも提供されています。
- dispatchEvent(event:Event):Boolean
- hasEventListener(type:String):Boolean
イベントクラス
イベントリスナーの引数にはイベント名を、イベントハンドラの引数にはイベントクラスのインスタンスを指定します。
ENTER_FRAMEなどのイベント名はEventクラスで静的メンバとして定められています。マウスイベントやキーボードイベントなどは、Eventクラスを継承したMouseEventクラスやKeyboardEventクラスとして提供されています。例えばマウスをクリックした時のイベントはMouseEventで定義されているイベント名CLICKを使います。
イベントクラスを利用するにはflash.events.Eventをインポートします。
import flash.events.Event;
MouseEventを利用する場合はさらにflash.events.MouseEventをインポートします。
import flash.events.MouseEvent;
次のように書くと全てのイベントを利用することができるようになります。
import flash.events.*;
イベントハンドラ
イベントハンドラでは受け取ったイベントオブジェクトを利用して処理を行うことができます。例えばtypeプロパティを使うとイベント名を取得することができます。
public function onMouseDown(ev:Event):void { switch(ev.type) { case MouseEvent.MOUSE_DOWN: //statement break; case MouseEvent.MOUSE_MOVE: //statement break; } }
マウスイベントでは、座標などの情報もイベントオブジェクトに含まれています。
private function onMouseUp(ev:MouseEvent) :void{ trace("OnMouseUp:",ev.localX,ev.localY); }
ENTER_FRAMEイベントの実装
ENTER_FRAMEイベントの処理を行っているサンプルです。フレームレートごとにENTER_FRAMEイベントが繰り返し送出されるのでアニメーションに利用することができます。
package { import flash.display.Sprite; import flash.events.Event; public class EventSample extends Sprite { import flash.events.Event; public function EventSample() { this.addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(ev:Event):void { trace("onEnterFrame"); } } }
onEnterFrame
onEnterFrame
onEnterFrame
onEnterFrame
マウスイベントの実装
Spriteごとにマウスイベントリスナーを追加してマウスイベントを送出することができます。イベントハンドラではマウスイベントのインスタンスを受け取ってそのメンバを利用します。例えば、イベントを発生させたSpriteにおけるマウス座標はlocalX,localYで取得することができます。ステージ上での座標はstageX,stageYになります。
package { import flash.display.Sprite; public class EventSample extends Sprite { import flash.events.Event; import flash.events.MouseEvent; public function EventSample() { this.graphics.beginFill(0xFFAACC); this.graphics.drawRect(0, 0, 100, 50); this.graphics.endFill(); //mouseEnabled = true; //マウスイベントを送出する(デフォルトでtrue) //doubleClickEnabled = true; // ダブルクリックイベントを送出する addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); addEventListener(MouseEvent.MOUSE_UP, onMouseUp); addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); } private function onMouseDown(ev:MouseEvent):void { trace("onMouseDown:",ev.localX,ev.localY); } private function onMouseUp(ev:MouseEvent) :void{ trace("OnMouseUp:",ev.localX,ev.localY); } private function onMouseMove(ev:MouseEvent):void { trace("OnMouseMove:",ev.localX,ev.localY); } } }
マウスイベント一覧
MouseEvent.CLICK
MouseEvent.DOUBLE_CLICK
MouseEvent.MOUSE_MOVE
MouseEvent.MOUSE_OUT
MouseEvent.MOUSE_OVER
MouseEvent.MOUSE_UP
MouseEvent.MOUSE_DOWN
MouseEvent.MOUSE_WHEEL
MouseEvent.ROLL_OUT
MouseEvent.ROLL_OVER
キーボードイベントの実装
キーボードイベントはStageが送出するイベントであるため、mainクラスからstageに対してイベントリスナーを設定します。
キーボードイベントのメンバとして、キーコードを格納しているkeyCodeプロパティや、CtrlやAlt,Shiftキーが押されているかどうかを判定するaltKey,ctrlKey,shiftKeyメソッドがあります。
package { import flash.display.Sprite; import flash.events.*; [SWF(width="300", height="300", backgroundColor="#FFFFFF", frameRate="30")] public class Main extends Sprite { public function Main():void { this.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); } private function onKeyDown(ev:KeyboardEvent):void { trace("onKeyDown",ev.keyCode); } } }
Keyboardイベント一覧
KeyboardEvent.KEY_DOWN
KeyboardEvent.KEY_UP
その他イベントの一覧です。
イベント名は派生クラスごとに新たに定義されています。
イベント一覧表
イベントクラスで定義されているイベント名 | イベントクラスの派生クラス一覧 |
ACTIVATE ADDED ADDED_TO_STAGE CANCEL CHANGE CLEAR CLOSE CLOSING(AIRのみ) COMPLETE CONNECT COPY CUT DEACTIVATE DISPLAYING ENTER_FRAME EXIT_FRAME EXITING(AIRのみ) FRAME_CONSTRUCTED FULL_SCREEN HTML_BOUNDS_CHANGE(AIRのみ) HTML_DOM_INITIALIZE(AIRのみ) HTML_RENDER(AIRのみ) ID3 INIT LOCATION_CHANGE(AIRのみ) MOUSE_LEAVE NETWORK_CHANGE(AIRのみ) OPEN PASTE REMOVED REMOVED_FROM_STAGE RENDER RESIZE SCROLL SELECT SELECT_AL SOUND_COMPLETE TAB_CHILDREN_CHANGE TAB_ENABLED_CHANGE TAB_INDEX_CHANGE UNLOAD USER_IDLE(AIRのみ) USER_PRESENT(AIRのみ) | ActivityEvent |