2009-10-04 86 views
1

是否有更好的方法來設置有很多導航的Flash項目不是必須這樣做?:最佳實踐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()或類似的東西。

我試過一次只添加一個事件監聽器的階段:

,然後函數會找到的名稱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功能將不需要知道刪除哪些聽衆,並相應地將當再次啓用按鈕時再次添加。它也將禁用其他MouseEvent,如MOUSE_OVER等。

而且我還建議按照Allan和Tahir的建議將按鈕存儲在數組中。

+0

來自每個人的真棒建議。這是我正在尋找的那個。我什至沒有關於.mouseEnabled paramater的事情。 所以總結.. var btnArray:Array = new Array(btn1,btn2,btn3);函數suspendBtns():void { for(var i:int = 0; i 2009-10-04 21:58:40

0

也許爲了節省一些打字的時間,你可以把所有的按鈕放到一個數組中。那麼,當你添加或刪除監聽器時,你可以用一個簡單的for循環遍歷數組上的每個元素?

0

一個簡單的布爾標誌,比如ignoreUI,也可以。在事件代碼中,檢查ignoreUI以查看函數是否應立即返回。這樣,當用戶點擊一個按鈕,一個下拉菜單等,如果不這樣做,就不會發生任何事情。

0

我在Flash網站上經常看到這個錯誤,我認爲它應該被認爲是一個錯誤。

我不同意布爾標誌,因爲即使使用布爾檢查,翻轉和轉出效果也可以工作(並且我不希望它們在轉換髮生時啓用)。

我在我的Flash項目中做的是我的所有按鈕都擴展了一個SimpleButton類,並帶有諸如和的公共函數。在這些公共功能中,我分配並移除了所有滾動/滾出/按下/釋放監聽器,以便這些功能可供所有按鈕使用。

另外,當調度點擊等事件時,我擴展了Event類並傳遞了一個額外的參數給父類,讓它知道哪個按鈕被點擊了。該父類可以跟蹤哪個按鈕處於活動狀態Now和哪個是Last按鈕,像activeButton_NewactiveButton_Last這樣的變量用於存儲其數值。

而且,是的,他們都應該是一個陣列內,因此很容易分配/刪除它們,這樣的事情:

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

,反之亦然聽衆的分配。