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
BrowserInvokeEvent
CaptionChangeEvent
CaptionTargetEvent
ColorPickerEvent
ComponentEvent
ContextMenuEvent
DataChangeEvent
DRMAuthenticateEvent
DRMAuthenticationCompleteEvent
DRMStatusEvent
FileListEvent
FocusEvent
HTMLUncaughtScriptExceptionEvent
HTTPStatusEvent
IKEvent
InvokeEvent
KeyboardEvent
LayoutEvent
ListEvent
MetadataEvent
MotionEvent
MouseEvent
NativeWindowBoundsEvent
NativeWindowDisplayStateEvent
NetStatusEvent
OutputProgressEvent
ProgressEvent
SampleDataEvent
ScrollEvent
ShaderEvent
SliderEvent
SoundEvent
SQLEvent
SQLUpdateEvent
StatusEvent
SyncEvent
TextEvent
TimerEvent
TweenEvent
UpdateEvent
VideoEvent