Saladin’s Blog

AS3 Event handling 매커니즘 1

Posted on: 12월 26, 2007

“Where is my onRelease !!! 😦 “

 
AS3.0을 접하고 어떤 외국개발자가 했던 절규다. 무비클립 이름뒤에 간편하게 걸수 있었던 on 이벤트가 완전히 사라진것을 두고 하는 말인것이다. as2에서 AS3로 개정되면서 가장 눈에 띄게 달라진 부분은 바로 이벤트처리에 관련된 메커니즘이다. 그 중심에 있는 것이 바로 EventDispatcher 클래스이고, 거의 모든 클래스들이 그 클래스로 부터 상속을 받음으로서 이벤트모델이 구현된다. 3.0에서는 onRelease나 onPress은 완전히 없어지고 모든 이벤트를 Event, MouseEvent 등에 있는 이벤트를 사용한다.
 
외형상으로 자바하고 똑같다. 물론 동작방식은 좀 차이가 있다.
Flash에서 이벤트라는 것은 Capture와 Bubble이라는 서로 다른 성격의 해시테이블에 호출함수가 미리 적재되어 이벤트 발생때마다 불러쓰는 방식을 사용한다. 마치 물안에 있는 물건을 집을때 물에 손을 집어 넣어 끄집어 내는 것을 상상하면된다.
 
이러한 개념을 Event Stream 이라고 하는데 흐름을 잘 이용하면 다른 이벤트까지 싸잡아 활성화시킬수 있으므로 AS2.0에 비해 무척 강력해졌다고 할 수 있을 것이다.
 
두 그림이 핵심적인 것들을 모두 설명하고 있다.
 
플래시에서 사각형A 그려 그것을 클릭하게 되면 가장 먼저 stage클래스가 반응하고, 가장 하위 단계의 DisplayOject인 _root가 반응을 한다음, 최종적으로 target object인 사각형A가 전달 받게 되고,
이벤트 함수가 호출되는데, 여기에서 사각형A의 리턴되는 모든 것들은 다시 역순으로 바깥으로 나오게 되는 식이다.
 
그러니까, 이런 코드가 있다고 가정한다. 
 
rectA.addEventListener(MouseEvent.CLICK, fnA, false(생략));
 
// 세번제 인자는 Capture를 사용하는냐의 여부이고, Boolean으로 정의하는데 여기서는 생략되었다. 기본값은 false다. 그러니까 디폴트로 버블링을 사용한다는 말.
rectA.rectB.addEventListener(MouseEvent.CLICK, fnB);
stage.addEventListener(MouseEvent.CLICK, fnC);
 
function fnA(e:MouseEvent):void{
    trace(“A”);
}
function fnB(e:MouseEvent):void{
    trace(“B”);
}
 
function fnC(e:MouseEvent):void{
    trace(“C”)
}
 
무비클립인 사각형 B가 사각형 A에 포함된 구조일때 B를 클릭했다고 치면 함수의 실행 순서는
 
fnB -> fnA -> fnC 의 순서이고 아웃풋창에는
 
B
A
C
 
가 출력된다.
기본값이 버블링 구조라고 했다. 버블링이라는 말은 클릭한 주체를 선두로 B와 가장 가까운 부모객체들부터 차례대로 따라오는 것이다.
 
그런데 이번에는 이벤트를 다르게 줘본다.
 
rectA.addEventListener(MouseEvent.CLICK, fnA, true);  
// A만 캡쳐모드 사용
rectA.rectB.addEventListener(MouseEvent.CLICK, fnB);
//버블링
stage.addEventListener(MouseEvent.CLICK, fnC);
//버블링
 
이렇게 되면 B를 클릭하더라도, B는 버블링이므로 이벤트가 아웃풋될때 발생하므로 Capture 모드를 활성화한 rectA가 먼저 반응하게 된다.
 
그러므로 결과는
 
A  – 캡쳐
B – 버블링
C – 버블링
 
만약 stage의 모드를 캡쳐로 놓게 된다고 하면.
stage는 잠수부에게 수면의 역할을 하게 되므로
똑같이 캡쳐를 쓴 A보다 먼저 반응하게 된다.
 
그러므로 결과는
 
C  – stage 캡쳐 //클릭시 가장 먼저 접하는 오브젝트.
A  – 캡쳐
B  – 버블링
 
모두 캡쳐로 주었을때는 먼저 선언한 순으로 실행된다
그러므로
 
C
A
B
 
만일 이벤트 모드 뒤에오는 인자값 prority가 B를 더 높게 준다면
C
B
A
가 된다.
 
이것이 바로 As3.0 이벤트의 가장 기초적인 메커니즘이다.
Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

일자별 보기

12월 2007
« 11월   1월 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

최근 사진

%d 블로거가 이것을 좋아합니다: