1. 이벤트 흐름(Event Flow)
capture -> target -> bubble
- Capture Phase : Staget 인스턴스에서 발생하여 하위 자식 객체로 이벤트를 전파하는 구간
- Target Phase : 이벤트가 발생된 타겟 객체 구간
- Bubbling Phase : Capture Phase와 반대로 자식 객체에서 Stage인스턴스로 이벤트를 전파하는 구가
조건
DisplayList에 존재하는 DisplayObject객체여야 한다(즉, stage에 addChild되어 있는 Display객체)
DisplayList에 존재하지 않은 객체는 이벤트의 발생을 직접적으로 리스너에게만 알린다.
2. 이벤트 흐름 선택적 등록 및 삭제
등록
addEventListener(
type:String, listener:Function,
useCapture:Boolean = false,
priority:int = 0,
useWeakReference:Boolean = false)
- Capture Phase를 위한 이벤트 등록
useCapture를 true로 세팅 addEventListener(type, listener, true);
- Target/Bubbling Phase를 위한 이벤트 등록
useCapture를 false로 세팅 addEventListener(type, listener, false);
- Capture Phase와 Target/Bubbling Phase를 모두 사용하기 위해서는
addEventListener(type, listener, true);
addEventListener(type, listener, false);
두개를 모두 등록해야 함
삭제
removeEventListener(
type:String, listener:Function,
useCapture:Boolean = false);
- Capture Phase를 위한 이벤트 삭제
useCapture를 true로 세팅 removeEventListener(type, listener, true);
- Target/Bubbling Phase를 위한 이벤트 삭제
useCapture를 false로 세팅 removeEventListener(type, listener, false);
- Capture Phase와 Target/Bubbling Phase를 모두 사용하기 위해서는
removeEventListener(type, listener, true);
removeEventListener(type, listener, false);
두개를 모두 삭제해야 함
3. 약참조, 강참조
addEventListener()함수 파라미터중 useWeakReference이 true로 설정하면 이벤트 등록이 약참조로 설정되어 레퍼런스 카운팅을 증가 시키지 않는다.
약참조일 경우 GC발생시점에 해당 이벤트가 소멸된다.
강참조일 경우 레퍼런스 카운팅이 증가 하여 이벤트를 등록한 객체가 사라져도 removeEventListener()를 호출하지 않으면 메모리에 그대로 남게 된다.
즉 객체의 소멸 시점을 정확하게 모를때 약참조를 사용하여 GC가 가능하게 해야 한다.
4. target / currentTarget
- target 이벤트를 발생한 객체
- currentTarget 이벤트를 듣는 객체
동일한 계층의 target과 currentTarget속성은 같은 객체 참조값을 가지지만 Capture Phase, Bubbling Phase구간의 경우는 currentTarget 속성값이 다르게 나타난다.
5. 현재 Event Phase 속성 확인
listener 등록 함수가 eventPhaseListener(event:Event):void 일때
Event발생후 listener 함수내에서 event.eventPhase 값으로 확인할 수 있다.
switch( event.eventPhase )
{
case EventPhase.CAPTURING_PHASE:
break;
case EventPhase.AT_TARGET:
break;
case EventPhase.BUBBLING_PHASE:
break;
}
6. Event 멈춤
Event 클래스에는 이벤트 전달을 멈추는 메소드 가 있다.
- stopImmediatePropagation() : 메소드가 사용된 시점부터 이벤트를 멈추게 한다. (동일한 오브젝트내 동일한 type 모두)
- stopPropagation() : 현재 오브젝트에 등록된 이벤트 listener 들을 수행한 후에 이벤트 전달을 멈추게 한다. (동일한 오브젝트내 동일한 type 모두)
7. Custom Event
Custom Event Class는 기본적으로 Event Class를 상속받아서 정의 한다.
Event를 상속받아 CustomEvent Class를 생성하여 생성자를 보면
public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
bubbles와 cancelable 파라미터가 있는데 그 기능은
- bubbles
true : Target Phase, Bubbling Phase 단계만 진행
false : Target Phase만 진행
- cancelable
true : event 객체의 preventDefault() 메소드를 사용 할 수 있다.
false : event 객체의 preventDefault() 메소드를 사용 할 수 없다.
preventDefault() 메소드는 디폴트 동작을 취소 하는 메소드 이다.
isDefaultPrevented()메소드로 알 수 있다.
7. Custom Event 생성시 override 하면 좋은 메소드
- clone() 메소드
Custom Event Class 생성후 clone() 메소드는 기존과 신규 properties들을 복사해서 Event객체를 생성하여 이벤트를 다시 재전달해야 하는 경우 사용한다.
- toString() 메소드
클래스의 명세를 보여 주는것을 목적으로 만든다.
취향에 따라 다르지만
utility function 중 formatToString(className:String, ...arguments):String 을 사용하면 편리하다.
className은 생성한 CustomEvent Class이름을 넣어도 되지만 다른 이름을 넣어도 된다.
나머지 arguments는 CustomEvent Class내 속성들을 String으로 넣으면 된다.
예로
formatToString("CustomEvent", "type", "bubbles","cancelable", "eventPhase",
"target", "currentTarget");
로 하면 된다.
- 2009/12/23 19:00
- kkangbba.egloos.com/2192985
- 덧글수 : 0



덧글