2009-03-17 5 views
0

누구나 이벤트에 관심이 있으십니까? 그래서 초기 동작을 변경하지 않고 동작을 수정할 수 있습니다.AS3, 이벤트 연결하기

특정 메뉴 버튼 집합을 클릭 할 때마다 원래의 콜백 호출 전 30 초를 기다리는 동작을 수정한다고 가정 해 보겠습니다.

저는 마이크로 지불을 통해 특정 기능에 대한 전체 액세스를 허용하는 방식으로 관리 할 수있게 해주는 기존의 Air 응용 프로그램 위에 레이어를 만드는 프로젝트에 참여하고 있습니다.

내 생각 엔 이벤트 캡쳐에 후킹을 사용했기 때문에 애플리케이션을 편집 할 필요가 없지만 확장 만하면됩니다. (내가 틀렸다면 :-)) 내가

답변

3

예, 약간 수정하면 가능합니다.

이벤트를 해체하는 대신 원래 목표에 도달하기 전에 이벤트를 중지하고 복제 한 다음 지연 후 클론을 다시 열 수 있습니다.

플래시에서 이벤트가 표시 목록 (볼 수있는 모든 것)에서 어떻게 작동하는지 모르는 경우 먼저 설명해주십시오.

버튼을 클릭하면 MouseEvent가 시작되고 캡처 이벤트가 시작됩니다.이 이벤트는 청취자가 등록되었을 때 설정된 우선 순위에 따라 "CLICK"이벤트에 등록 된 모든 이벤트 수신자를 호출하는 단계에서 시작됩니다. 리스너의 우선 순위가 같으면 (기본값은 0) 임의의 순서로 호출됩니다 (등록 된 순서대로). 스테이지의 모든 리스너가 조상 버튼이 호출 된 버튼의 목록에서 다음 displayObject로 호출되면 동일한 작업이 다시 발생합니다. 이렇게하면 마우스 이벤트 (버튼 내부의 텍스트 필드 레이블 일 수 있음)를 허용하는 대부분의 display 객체 내부까지 계속 진행됩니다. 여기서 캡처 단계가 끝나고 대상 단계가 시작됩니다. 가장 안쪽의 오브젝트에있는 모든 리스너가 대상 단계에서 호출됩니다. 그런 다음 버블 링 단계가 시작됩니다. 여기서 모든 양구장은 부모와 조부모에게 이전과 같은 방식으로 (그러나 밖으로부터) 단계까지 계속 호출됩니다.

플래시에서 대상 단계는 버블 링 단계의 일부로 처리됩니다.

그리고 어떻게 이것을 사용할 수 있습니까?

음, 등록 할 때 이벤트 리스너를 지정하면 위상과 우선 순위가 지정됩니다.기본값은 버블 링 단계 및 우선 순위 0입니다. 따라서 우선 순위가 int.MAX_VALUE 인 캡처 단계에서 스테이지에 클릭 이벤트 리스너를 등록하면 다른 동일한 리스너를 제외하고 다른 리스너보다 먼저 이벤트가 발생합니다. 다음 코드는 다른 리스너에 의해 클릭 이벤트가 등록되지 않도록합니다.

stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE); 

function stageClick(e:MouseEvent):void 
{ 
    e.stopImmediatePropagation(); 
} 

기타 문제가 발생하면 모든 것을 수행하고 싶지 않습니다.

  • 하나의 해결책은 자신의 이벤트를 수정해야 모든 버튼의 목록을 가지고, 그리고 e.target로에 대한 을 확인하는 것입니다.
  • 또 다른 해결책은 지연을 요구하는 모든 단추를 사용하는 것입니다. 은 인터페이스를 구현합니다 ( IButtonDelay라고 함). 그런 다음 e.target이 IButtondelay 인 경우 간단한 확인 을 확인하십시오. 단지 는 (메뉴 바 같이) containg 부모의 이벤트를 수신하는 것이 어쨌든이 부모에 도달하기 전에 이벤트 를 사용하는 것이 가능성 때문에
  • 세 번째 해결책은 될 것이다.

처음 두 솔루션의 경우 검색 작업을 단순화하기 위해 버튼 자식에 대한 mouseinteraction을 방지해야합니다 (DisplayObjectContainer.mouseChildren = false). 여기서 무엇을 선택하든, 다음은 간단한 타이머로 연기해야합니다. 그리고 연기가 된 후에 다시 이벤트를 시작하십시오.

e.target.dispatchEvent(e.clone()); 

이렇게하면 refired 이벤트가 지연되지 않는 문제가 발생합니다. 내 제안 대신 간단한 복제 대신 MouseEvent 상속 이벤트 개체를 발생시키는 것입니다. MouseEvent는 매우 간단하게 복사 할 수 있으며 몇 가지 속성 만 가지고 있습니다. 따라서 두 번째로 캡처 할 때 정상 마우스 클릭인지 복제 된 것인지 확인할 수 있습니다. 당신은 이벤트의 종류 이상 (키보드 이벤트)를 수신 할 수도 있습니다

stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE); 

function stageClick(e:MouseEvent):void 
{ 
    if(e.target is IDelayButton && !e is DelayedMouseEvent) 
    { 
     e.stopImmediatePropagation(); 
     DelayEvent(e); 
    } 
} 

function DelayEvent(e:MouseEvent):void 
{ 
    //You code for the delaying, cloning and refiring the event here 
} 

하지만, 대부분의 코드가 만들어 질 수있다 : 무언가 같이 버튼에 inface와 솔루션을 사용

, 그것은 것 그것들을 포함하기에 충분합니다.

긴 읽기에 도움이되고 유감 스럽습니다.

+0

아주 좋은 답변입니다. –

+0

환영합니다. 행복한 코딩. –

0

내 머리 꼭대기에서 나는 다음과 같이 할 수 있다고 생각한다 : click 이벤트에 이벤트 핸들러를 사용하고 Timer을 사용하면 또는 OR 호출에 일부 처리를 수행 한 후 후자의 완료시 click에 해당하는 조치를 호출하십시오.

또는 누락 된 것이 있습니까?

2

실제로 응용 프로그램을 변경하지 않고 이러한 방식으로 이벤트 시스템을 변경할 수 있다고 생각하지 않습니다 (응용 프로그램을 변경할 수 있으면이 동작을 가능하게하는 사용자 지정 단추를 만들기가 어렵습니다)

가장 간단한 해결책은 차단하려는 단추 위에 다른 Sprite/Button을 추가하는 것입니다. 이렇게하면 응용 프로그램을 많이 변경하지 않아도되고 차단이 간단 해집니다. 단점 : 마우스 이벤트가 발생하지 않으므로 원래 버튼의 마우스 오버 동작이 작동하지 않습니다.