언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 1.0, Flash Player 9, Flash Lite 4 |
이벤트 대상은 Flash® Player 및 Adobe AIR 이벤트 모델에서 중요한 부분입니다. 이벤트 대상은 표시 목록의 계층 구조를 통과하는 이벤트 흐름의 초점으로 사용됩니다. 마우스 클릭이나 키 누르기와 같은 이벤트가 발생하면 표시 목록의 루트에서 이벤트 흐름으로 이벤트 객체가 전달됩니다. 이벤트 객체는 이벤트 대상까지 왕복하는 과정을 거치게 되는데, 이 과정은 개념적으로 세 단계로 나누어집니다. 캡처 단계에는 루트에서 이벤트 대상 노드에 이르기 바로 전 노드까지가 포함되고, 대상 단계에는 이벤트 대상 노드만 포함되며, 버블링 단계에는 표시 목록의 루트로 돌아오는 과정에서 거쳐 간 모든 후속 노드가 포함됩니다.
일반적으로, 사용자 정의 클래스에 이벤트 전달 기능을 부여하는 가장 쉬운 방법은 EventDispatcher를 확장하는 것입니다. 이미 다른 클래스를 확장하여 이 클래스를 확장할 수 없는 경우에는 대신 IEventDispatcher 인터페이스를 구현하여 EventDispatcher 멤버를 만들고 간단한 연결을 작성하여 집계된 EventDispatcher로 호출을 라우팅하는 방법이 있습니다.
메서드 | 정의 주체 | ||
---|---|---|---|
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
리스너에서 이벤트 알림을 받을 수 있도록 EventDispatcher 객체에 이벤트 리스너 객체를 등록합니다. | IEventDispatcher | ||
이벤트를 이벤트 흐름으로 전달합니다. | IEventDispatcher | ||
EventDispatcher 객체에 특정 유형의 이벤트에 대한 리스너가 등록되어 있는지 여부를 확인합니다. | IEventDispatcher | ||
EventDispatcher 객체에서 리스너를 제거합니다. | IEventDispatcher | ||
이 EventDispatcher 객체 또는 조상 객체에 지정한 이벤트 유형에 대한 이벤트 리스너가 등록되어 있는지 여부를 확인합니다. | IEventDispatcher |
addEventListener | () | 메서드 |
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 1.0, Flash Player 9, Flash Lite 4 |
리스너에서 이벤트 알림을 받을 수 있도록 EventDispatcher 객체에 이벤트 리스너 객체를 등록합니다. 표시 목록의 모든 노드에서 특정 유형의 이벤트, 단계, 우선 순위에 대한 이벤트 리스너를 등록할 수 있습니다.
이벤트 리스너의 등록을 마친 뒤에는 addEventListener()
를 추가로 호출하여 그 우선 순위를 변경할 수 없습니다. 리스너의 우선 순위를 변경하려면 먼저 removeEventListener()
를 호출해야 합니다. 그런 다음 해당 리스너를 새로운 우선 순위 레벨로 다시 등록할 수 있습니다.
리스너가 등록된 다음, 이어서 type
또는 useCapture
에 다른 값을 설정하여 addEventListener()
를 호출하면 별도의 리스너 등록이 만들어집니다. 예를 들어 useCapture
가 true
로 설정된 리스너를 등록하면 이 리스너는 캡처 단계 동안에만 수신합니다. 그러나 useCapture
를 false
로 설정하고 동일한 리스너 객체를 사용하여 addEventListener()
를 다시 호출하면 별도로 두 개의 리스너가 등록되어, 한 리스너는 캡처 단계 동안 수신하고 다른 하나는 대상 및 버블링 단계 동안 수신합니다.
대상 단계 또는 버블링 단계 전용의 이벤트 리스너를 등록할 수는 없습니다. 버블링은 대상 노드의 조상에만 적용되기 때문에 이들 단계는 등록 과정에서 하나로 통합됩니다.
사용하지 않는 이벤트 리스너는 EventDispatcher.removeEventListener()
를 호출하여 제거하도록 합니다. 이렇게 하지 않으면 메모리 문제가 발생할 수 있습니다. 가비지 수집기는 참조가 남아 있는 객체를 제거하지 않으므로, 등록된 이벤트 리스너가 있는 객체는 메모리에서 자동으로 제거되지 않습니다.
EventDispatcher 인스턴스를 복사해도 연결된 이벤트 리스너는 복사되지 않습니다. 새로 만든 노드에 이벤트 리스너가 필요한 경우, 노드를 만든 후 리스너를 연결해야 합니다. 그러나 EventDispatcher 인스턴스를 이동할 때에는 연결된 이벤트 리스너도 함께 이동됩니다.
이벤트가 노드에서 처리되는 동안 이벤트 리스너도 이 노드에서 등록되는 중이면, 이벤트 리스너가 현재 단계에서는 트리거되지 않지만 버블링 단계와 같은 이벤트 흐름의 나중 단계에서 트리거될 수 있습니다.
이벤트를 처리 중인 노드에서 이벤트 리스너를 제거하는 경우, 그 리스너는 현재 액션에 의해 트리거됩니다. 일단 제거된 이벤트 리스너는 이후의 처리를 위해 재등록하지 않는 한 다시는 호출되지 않습니다.
매개 변수
type:String — 이벤트 유형입니다.
| |
listener:Function — 이벤트를 처리하는 리스너 함수입니다. 아래 예제에서 보듯이, 이 함수는 이벤트 객체를 유일한 매개 변수로 사용하며 아무 것도 반환하지 않아야 합니다.
| |
useCapture:Boolean (default = false ) — 리스너가 캡처 단계에서 작동하는지 아니면 대상 및 버블링 단계에서 작동하는지를 결정합니다. useCapture 가 true 로 설정된 경우, 리스너는 캡처 단계에서만 이벤트를 처리하고 대상 또는 버블링 단계에서는 작동하지 않습니다. useCapture 가 false 인 경우, 리스너는 대상 또는 버블링 단계 동안에만 이벤트를 처리합니다. 세 단계 모두에서 이벤트를 수신하려면 addEventListener() 를 두 번 호출해야 합니다. 먼저 useCapture 를 true 로 설정하여 호출한 다음 useCapture 를 false 로 설정하여 다시 호출합니다.
| |
priority:int (default = 0 ) — 이벤트 리스너의 우선 순위 레벨입니다. 우선 순위는 32비트 정수로 지정됩니다. 숫자가 클수록 우선 순위가 높습니다. 우선 순위가 n인 리스너를 모두 처리한 뒤에 우선 순위가 n-1인 리스너가 처리됩니다. 둘 이상의 리스너가 우선 순위가 같을 경우, 추가된 순서에 따라 처리됩니다. 기본 우선 순위는 0입니다.
| |
useWeakReference:Boolean (default = false ) — 리스너에 대한 참조가 강한지 아니면 약한지를 결정합니다. 강한 참조(기본값)는 해당 리스너의 가비지 수집을 막습니다. 약한 참조는 이를 막지 못합니다. 클래스 레벨 멤버 함수는 가비지 수집의 영향을 받지 않으므로 가비지 수집과 상관없이 클래스 레벨 멤버 함수의 |
dispatchEvent | () | 메서드 |
public function dispatchEvent(event:Event):Boolean
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 1.0, Flash Player 9, Flash Lite 4 |
이벤트를 이벤트 흐름으로 전달합니다. 이벤트 대상은 dispatchEvent()
가 호출되는 EventDispatcher 객체입니다.
매개 변수
event:Event — 이벤트 흐름에 전달된 이벤트 객체입니다.
|
Boolean — preventDefault() 가 이벤트에서 호출되지 않은 경우 true 값이고, 호출된 경우 false 를 반환합니다.
|
hasEventListener | () | 메서드 |
public function hasEventListener(type:String):Boolean
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 1.0, Flash Player 9, Flash Lite 4 |
EventDispatcher 객체에 특정 유형의 이벤트에 대한 리스너가 등록되어 있는지 여부를 확인합니다. 이를 통해 이벤트 흐름 계층 구조의 어떤 지점에서 EventDispatcher 객체가 이벤트 유형 처리를 변경했는지 확인할 수 있습니다. 특정 이벤트 유형이 실제로 이벤트 리스너를 트리거하는지 여부를 확인하려면 IEventDispatcher.willTrigger()
를 사용합니다.
hasEventListener()
와 willTrigger()
간의 차이점은 hasEventListener()
가 자신이 속한 객체만 검사하는 반면 willTrigger()
는 type
매개 변수에 의해 지정된 이벤트의 전체 흐름을 검사한다는 점입니다.
매개 변수
type:String — 이벤트 유형입니다.
|
Boolean — 지정된 유형의 리스너가 등록되어 있으면 true 이고, 그렇지 않으면 false 입니다.
|
관련 API 요소
removeEventListener | () | 메서드 |
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 1.0, Flash Player 9, Flash Lite 4 |
EventDispatcher 객체에서 리스너를 제거합니다. EventDispatcher 객체와 함께 등록된 리스너 중 일치하는 것이 없다면 이 메서드를 호출해도 아무 영향이 없습니다.
매개 변수
type:String — 이벤트 유형입니다.
| |
listener:Function — 제거할 리스너 객체입니다.
| |
useCapture:Boolean (default = false ) — 리스너가 캡처 단계용으로 등록되었는지 아니면 대상 및 버블링 단계용으로 등록되었는지를 지정합니다. 리스너가 캡처 단계 및 대상/버블링 단계에 대해 모두 등록된 경우 두 리스너를 제거하려면 removeEventListener() 를 두 번 호출해야 합니다. 한 번은 useCapture 를 true 로 설정하여 호출하고 한 번은 useCapture 를 false 로 설정하여 호출합니다.
|
willTrigger | () | 메서드 |
public function willTrigger(type:String):Boolean
언어 버전: | ActionScript 3.0 |
런타임 버전: | AIR 1.0, Flash Player 9, Flash Lite 4 |
이 EventDispatcher 객체 또는 조상 객체에 지정한 이벤트 유형에 대한 이벤트 리스너가 등록되어 있는지 여부를 확인합니다. 지정된 유형의 이벤트가 이 EventDispatcher 객체나 그 자손으로 전달되었을 때 이벤트 흐름의 특정 단계에서 이벤트 리스너가 트리거되는 경우 이 메서드는 true
를 반환합니다.
hasEventListener()
와 willTrigger()
간의 차이점은 hasEventListener()
가 자신이 속한 객체만 검사하는 반면 willTrigger()
는 type
매개 변수에 의해 지정된 이벤트의 전체 흐름을 검사한다는 점입니다.
매개 변수
type:String — 이벤트 유형입니다.
|
Boolean — 지정된 유형의 리스너가 트리거될 경우에는 true 이고, 그렇지 않으면 false 입니다.
|
decorDispatcher
라는 DecoratedDispatcher 클래스의 새 인스턴스가 생성되고 decorDispatcher
변수를 사용하여 addEventListener()
가 사용자 정의 이벤트 doSomething
과 함께 호출됩니다. 함께 호출된 이벤트는 trace()
를 사용하여 한 줄로 된 텍스트를 출력하는 didSomething()
을 통해 처리됩니다.
package { import flash.events.Event; import flash.display.Sprite; public class IEventDispatcherExample extends Sprite { public function IEventDispatcherExample() { var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher(); decorDispatcher.addEventListener("doSomething", didSomething); decorDispatcher.dispatchEvent(new Event("doSomething")); } public function didSomething(evt:Event):void { trace(">> didSomething"); } } } import flash.events.IEventDispatcher; import flash.events.EventDispatcher; import flash.events.Event; class DecoratedDispatcher implements IEventDispatcher { private var dispatcher:EventDispatcher; public function DecoratedDispatcher() { dispatcher = new EventDispatcher(this); } public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{ dispatcher.addEventListener(type, listener, useCapture, priority); } public function dispatchEvent(evt:Event):Boolean{ return dispatcher.dispatchEvent(evt); } public function hasEventListener(type:String):Boolean{ return dispatcher.hasEventListener(type); } public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{ dispatcher.removeEventListener(type, listener, useCapture); } public function willTrigger(type:String):Boolean { return dispatcher.willTrigger(type); } }
Tue Jun 12 2018, 03:17 PM Z