180bpm

이벤트 전파 모델 본문

Flash/AS3

이벤트 전파 모델

powdersnow 2012. 1. 27. 17:27

추가 설명. 이 그림에서 가운데 stage부터 mc6의 의미는
stage에 mc1이 있고 그 안에 mc2 그 안에 mc3..식으로 되어있는 구조이다.

이벤트 반응은 기본적으로는 캡쳐 상태(eventPhase : 1)에선 반응하지 않고 타겟팅이나 버블링 상태에서 반응한다.
target은 지정된 객체, currentTarget은 버블링을 거치면서 이벤트가 처리되고 있는 객체. 그래서 currentTarget은 계속 변한다.

*이벤트 클래스의 주요 속성
Type : String - 이벤트의 이름. 주로 상수를 많이 쓴다.
target : EventDispatcher - 이벤트를 발생시킨 객체 참조
currentTarget : EventDispatcher - 현재 이벤트를 처리하고 있는 객체 참조
eventPhase : uint - 현재 이벤트의 처리 단계를 나타내고 있는 상수값
bubbles : Boolean - 이벤트가 버블 단계를 거칠것인가? (기본값 - false)
cancelable : Boolean - 이벤트의 취소 가능 여부 (기본값 - false)


이벤트의 중지법
event.stopPropagation();


소스 분석

private function onDown($e:MouseEvent):void {
			var me:MouseEventEx = $e as MouseEventEx;
			if (me.buttonIdx == MouseEventEx.RIGHT_BUTTON) {
				dragObject = $e.target as Sprite;
				if (dragObject) {
					setChildIndex(dragObject, numChildren - 1);
					dragX = dragObject.mouseX;
					dragY = dragObject.mouseY;
					enter = 0;
					stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
					stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
				}
			}


dragObject(보석 스프라이트) 에는 mouseChildren이 false 상태여서 인터랙션이 하부까지 전달 되진 않는다.
대신 스테이지에 이벤트를 걸어서 스테이지의 자식 객체까지 이벤트가 전파 될 수는 있다.
이벤트가 발생하면 dragObject = $e.target as Sprite; 로 형 변환을 하는데 sprite와 stage는 디스플레이 오브젝트 컨테이너의 자식 클래스라서 겹치진 않는다. (상속 관계가 아니다)


*이벤트 클래스와 이벤트 디스패쳐 클래스의 내용

우선 이벤트 디스패쳐 클래스가 이벤트 클래스를 상속 받는 관계는 아니다. 둘 다 Object Class를 상속받는다.


참고 http://livedocs.adobe.com/flash/9.0_kr/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000138.html

차례대로 속성/메소드, 레퍼런스의 설명

속성

bubbles : Boolean

[읽기 전용] 이벤트가 버블링 이벤트인지 여부를 나타냅니다.


cancelable : Boolean

[읽기 전용] 해당 이벤트와 연관된 비헤이비어를 차단할 수 있는지 여부를 나타냅니다.


currentTarget : Object

[읽기 전용] 이벤트 리스너를 통해 Event 객체를 처리하고 있는 객체입니다.


eventPhase : uint

[읽기 전용] 이벤트 흐름에서 현재 단계입니다.


target : Object

[읽기 전용] 이벤트 대상입니다.


type : String

[읽기 전용] 이벤트 유형입니다.


메서드

Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)

이벤트 리스너에 매개 변수로 전달할 Event 객체를 만듭니다.



clone():Event

Event 하위 클래스의 인스턴스를 복제합니다.


formatToString(className:String, ... arguments):String

사용자 정의 ActionScript 3.0 Event 클래스에서 toString() 메서드를 구현하기 위한 유틸리티 함수입니다.

isDefaultPrevented():Boolean

이벤트에서 preventDefault() 메서드가 호출되었는지 여부를 확인합니다.

 

preventDefault():void

이벤트의 기본 비헤이비어를 취소할 수 있는 경우, 그 비헤이비어를 취소합니다.


stopImmediatePropagation():void

이벤트 흐름에서 현재 노드 및 그 후속 노드에 있는 모든 이벤트 리스너가 처리되지 않도록 합니다.


stopPropagation():void

이벤트 흐름에서 현재 노드의 후속 노드에 있는 모든 이벤트 리스너가 처리되지 않도록 합니다.


toString():String

Event 객체의 속성이 모두 포함된 문자열을 반환합니다.


메서드
EventDispatcher(target:IEventDispatcher = null)
EventDispatcher 클래스의 인스턴스를 집계합니다.

addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
리스너에서 이벤트 알림을 받을 수 있도록 EventDispatcher 객체에 이벤트 리스너 객체를 등록합니다.

dispatchEvent(event:Event):Boolean
이벤트를 이벤트 흐름으로 전달합니다.

hasEventListener(type:String):Boolean
EventDispatcher 객체에 특정 유형의 이벤트에 대한 리스너가 등록되어 있는지 여부를 확인합니다.

removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
EventDispatcher 객체에서 리스너를 제거합니다.

willTrigger(type:String):Boolean
이 EventDispatcher 객체 또는 조상 객체에 지정한 이벤트 유형에 대한 이벤트 리스너가 등록되어 있는지 여부를 확인합니다.

참고
http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/flash/events/EventDispatcher.html#addEventListener()
http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/flash/events/Event.html#propertySummary


다음 공부 과제

http://help.adobe.com/ko_KR/as3/learn/WSf00ab63af761f170-4ed0731912937da73f7-7ffe.html
http://help.adobe.com/ko_KR/as3/learn/WSf00ab63af761f170-4ed0731912937da73f7-7fe5.html

function Event(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
이벤트 리스너에 매개 변수로 전달할 이벤트 객체를 생성.
버블링과 캔슬에이블의 경우 디폴트는 false다. 그렇다고 버블링과 캔슬에이블이 안되는것이 아니고 이것들이 가능한지 여부를 알려주는 변수입니다. 일부 이벤트, 엔터프레임이나 이닛등은 버블링이 적용되지 않기 때문에 이벤트 흐름에 참여하지 않습니다.
그러니까 Event 클래스가 가진 속성들은 값을 변경해서 사용하는것이 아니고 현재 이벤트의 속성만 알 수 있는 변수들입니다.

이벤트 클래스는 크게 3가지로 나눠집니다.
유틸리티 메서드 - 이벤트 객체의 복사본을 만들거나 문자열로 변환 시킬 수 있음.
클론과 포맷투스트링 투스트링이 있는데 커스텀 이벤트를 만들때 하위 클래스를 속성을 복제하거나 사용자 데이터를 넘겨줄때 쓴다. 둘 다 오버라이딩을 해야한다. 그리고 클론의 경우 일부 속성만 설정하면 설정되지 않은 속성은 리스너가 재 전달한 이벤트를 처리할때 쓰레기값이 들어가거나 하는 문제가 생긴다.
이벤트 흐름 메서드 - 이즈 디폴트 프리벤티드, 프리벤티드 디폴트 두개가 연관. 은 버블링 단계에 있는 모든 타겟에 취소
스탑 이미디어트 프라퍼게이션 이것은 커런트 타겟의 이벤트 처리를 취소
기본 비헤이비어 메서드 - 캔셀에이블과 관련된 메소드.


이벤트 디스패쳐엔 애드이벤트리스너와 리무브이벤트 리스너 메서드가 포함되어있다.
AS3 이벤트 모델은 DOM(도큐먼트 오브젝트 모델)과 다른 부분중 하나.
DOM에서는 이벤트 리스너는 이벤트 리스너 인터페이스를 구현하는 클래스의 인스턴스. 리스너 함수는 핸들이벤트라는 클래스의 메서드. 그리고 리스너 함수를 포함하는 클래스 인스턴스를 등록한다.
하지만 AS3 이벤트 모델은 이벤트 리스너와 리스너 함수간에 차이가 없음. 이벤트 리스너 인터페이스가 없으며 리스너 함수를 클래스 외부에, 혹은 클래스의 일부러 정의 가능.

어제 나왔던 궁금증이었던 addEventListener의 3번째 파라메터. 이것은 true/false라기 보다 오히려 on/off에 가깝다. true가 되면 캡쳐링 단계가 활성화 되고 false면 버블링 단계가 활성화 된다. 둘 다 사용하고 싶다면 addEventListener을 두번 걸어야한다.
4번째 파라메터는 이벤트 처리순위를 정해주는 파라메터다. 우선 순위가 같다면 추가된 순서대로 실행된다.
useWeakReference 파라메터가 true일 경우 이벤트가 걸린 인스턴스가 누군가를 참조하지 않는다면 GC의 대상이 된다.
useWeakReference를 쓰면 인스턴스에 removeEventlistener와 null을 넣지 않아도 알아서 수집 되기 때문에 편하겠지만 의도치 않은 동작이 발생 할 수 있다고 생각한다.

removeEventListener의 파라메터는 3개. 얘도 버블링과 타겟팅이 구분이 된다. 만약 일치 하는 타입이 없다고 해도 아무 영향은 없다.

hasEventListener()는 대상 인스턴스에 타입과 일치하는 이벤트가 있는지에 대해 불린값으로 리턴.
willTrigger()는 조상객체까지 검사한다.
Comments