2009-10-04 74 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(); 
} 

,反之亦然听众的分配。