예, 약간 수정하면 가능합니다.
이벤트를 해체하는 대신 원래 목표에 도달하기 전에 이벤트를 중지하고 복제 한 다음 지연 후 클론을 다시 열 수 있습니다.
플래시에서 이벤트가 표시 목록 (볼 수있는 모든 것)에서 어떻게 작동하는지 모르는 경우 먼저 설명해주십시오.
버튼을 클릭하면 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와 솔루션을 사용
는
, 그것은 것 그것들을 포함하기에 충분합니다.
긴 읽기에 도움이되고 유감 스럽습니다.
아주 좋은 답변입니다. –
환영합니다. 행복한 코딩. –