2009-10-04 7 views
1

이 작업을 수행하는 것보다 탐색의 많은 플래시 프로젝트를 설정하는 더 좋은 방법이모범 사례 ActionScript에서 버튼을 일시 중단에 대한 3

bottomNav.contact_btn.addEventListener(MouseEvent.CLICK, changeContent); 
bottomNav.portfolio_btn.addEventListener(MouseEvent.CLICK, changeContent); 
bottomNav.news_btn.addEventListener(MouseEvent.CLICK, changeContent); 
bottomNav.inspiration_btn.addEventListener(MouseEvent.CLICK, changeContent); 
bottomNav.home_btn.addEventListener(MouseEvent.CLICK, changeContent); 


secondaryNav.about_btn.addEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.services_btn.addEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.home_btn.addEventListener(MouseEvent.CLICK, changeContent); 

secondaryNav.inspiration_btn.addEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.inspiration_archive_btn.addEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.portfolio_showcase_btn.addEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.portfolio_archive_btn.addEventListener(MouseEvent.CLICK, changeContent); 

와 그렇지 않은 경우를,?가 애니메이션 사이의 순간은 항상있다 마지막으로 사용자가 원하는 것은 버튼을 클릭하고 두 장면 사이에서 아름다운 닦음의 중간에 다른 기능을 실행하는 것입니다. 당신은 끝내거나 (또는 ​​적어도 내가) 수많은 오류와 클라이언트를 화나게했다.

다른 모든 기능의 끝에 기능을 추가하지 않고 일시적으로 사용 중지하지 않으면 모든 리스너를 일시 중지하려면 어떻게해야합니까?

누군가 마법의 연습을하고 있다면, 듣고 싶습니다.

나는 이런 식으로 뭔가 쓰고 한 그것을 할 방법에 관해서

:

function suspendBtns():void 
{ 
secondaryNav.inspiration_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.portfolio_showcase_btn.removeEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.portfolio_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent); 

} 

suspendBtns()를 추가; 클립 사이에서 전환 할 모든 기능의 끝까지.
분명히 enactBtns() 또는 이와 비슷한 다른 함수가 있습니다.

나는 한 번에 단지 단 하나 개의 이벤트 리스너를 추가하는 시도 :

stage.addEventListner(MouseEvent.CLICK, doFunction); 

을하고 함수처럼 btn을의 이름을 찾아 낼 것입니다 : 등등

function doFunction(e:Event):void{ 

switch(e.target.name){  
    case"home_btn": 
    doThis(); 
    break; 

    case"away_btn": 
    doThat(); 
    break; 

    } 

} 

합니다. 그다지 잘 작동하지 않았다. 마치 모든 버튼을 두 번 눌러 작동시켜야하는 것처럼 느껴졌다.

그리고 여전히 작업 사이에 이벤트 수신기를 일시 중단해야했습니다.

답변

2

위의 suspendBtns 예제 함수와 같이 버튼을 일시적으로 비활성화하려면 리스너를 제거하는 대신 mouseEnabled를 false로 설정하십시오.

그래서 대신 :

function suspendBtns():void 
{ 
secondaryNav.inspiration_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.portfolio_showcase_btn.removeEventListener(MouseEvent.CLICK, changeContent); 
secondaryNav.portfolio_archive_btn.removeEventListener(MouseEvent.CLICK, changeContent); 
} 

은 ... 당신은 것입니다 :

function suspendBtns():void 
{ 
secondaryNav.inspiration_archive_btn.mouseEnabled = false; 
secondaryNav.portfolio_showcase_btn.mouseEnabled = false; 
secondaryNav.portfolio_archive_btn.mouseEnabled = false; 
} 

그 방법은 suspendBtns 기능으로 대응하게 제거하는 것을 청취자 알 필요하지 않습니다 단추를 다시 사용할 수있게되면 다시 추가됩니다. 또한 MOUSE_OVER 등의 다른 MouseEvent도 사용할 수 없게됩니다.

그리고 Allan과 Tahir의 제안에 따라 버튼을 배열에 저장하는 것이 좋습니다.

+0

모두의 멋진 제안입니다. 이것이 제가 찾고있는 것입니다. .mouseEnabled 매개 변수에 관한 것조차도하지 않았습니다. 결론적으로 .. var btnArray : Array = new Array (btn1, btn2, btn3); function suspendBtns() : void {0} {var i : int = 0; i < } } –

0

아마도 일부 타이핑을 저장하기 위해 모든 버튼을 배열로 푸시 할 수 있습니다. 그런 다음 청취자를 추가하거나 제거 할 때 간단한 for 루프를 사용하여 배열의 각 요소를 반복 할 수 있습니까?

0

ignoreUI와 같은 간단한 부울 플래그도 작동합니다. 이벤트 코드에서 ignoreUI를 검사하여 함수가 즉시 반환되는지 확인합니다. 그렇게하지 않으면 사용자가 단추, 드롭 다운 등을 클릭 할 때 아무 것도 발생하지 않습니다.

0

이 버그는 플래시 사이트에서 자주 볼 수 있으며 버그로 간주되어야한다고 생각합니다.

불리언 플래그로도 롤오버 및 롤아웃 효과가 작동하고 전환이 발생하면 활성화되지 않기 때문에 부울 플래그에 동의하지 않습니다.

내가 플래시 프로젝트에서 수행하는 작업은 모두 내 버튼이 및과 같은 공용 함수가있는 SimpleButton 클래스를 확장한다는 것입니다. 이러한 공용 함수 내에서 모든 롤오버/출력/누름/릴리스 리스너를 할당하고 제거하므로 모든 버튼에서 해당 기능을 사용할 수 있습니다.

또한 click 등의 이벤트를 전달할 때 이벤트 클래스를 확장하고 부모 클래스에 추가 인수를 전달하여 클릭 한 버튼을 알립니다. 그 부모 클래스는 activeButton_NewactiveButton_Last과 같은 변수에 Last 버튼이었던 Now 버튼과 현재 버튼을 추적 할 수 있습니다.

그리고 그것은 매우,이 같은/지정을 쉽게 제거가되도록, 그래 모두가 배열 내에 있어야합니다 : 청취자의 할당

for (var i:int = 0; i < this.arrayForButtons.length; i ++) 
{ 
SimpleButton (this.arrayForButtons[ i ]).removeListeners(); 
} 

와 그 반대의 경우도 마찬가지입니다.