是否有更好的方法来设置具有大量导航的Flash项目而不是必须这样做?:
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;
}
}
等等。这不是很好,感觉好像我必须点击每个按钮两次才能使它工作。
我仍然需要在两次操作之间暂停事件监听器。
答案 0 :(得分: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的建议将按钮存储在一个数组中。
答案 1 :(得分:0)
也许为了节省一些打字,你可以把所有按钮都推到一个数组中。那么,当您添加或删除侦听器时,您可以使用简单的for循环遍历数组中的每个元素?
答案 2 :(得分:0)
一个简单的布尔标志,例如ignoreUI,也可以。在事件代码中,检查ignoreUI以查看函数是否应立即返回。这样,当用户点击按钮,下拉菜单等时,如果不应该这样做,则不会发生任何事情。
答案 3 :(得分:0)
我经常在Flash网站上看到这个bug,我认为它应该被视为一个bug。
我不同意布尔标志,因为即使使用布尔检查,翻转和转出效果也会起作用(我不喜欢在转换发生时启用它们)。
我在我的flash项目中所做的是我的所有按钮都扩展了一个SimpleButton类,其中包含和的公共函数。在这些公共函数中,我分配并删除所有翻转/输出/按下/释放侦听器,以便所有按钮都可以使用这些功能。
另外,在调度click等事件时,我会扩展Event类并将一个额外的参数传递给父类,让它知道点击了哪个按钮。该父类可以跟踪哪个按钮处于活动状态,哪个是最后一个按钮,在activeButton_New
和activeButton_Last
等变量中可以存储它们的数值。
并且,是的,它们都应该在一个数组中,因此分配/删除它们变得相当容易,如下所示:
for ( var i:int = 0; i < this.arrayForButtons.length; i ++ )
{
SimpleButton ( this.arrayForButtons[ i ] ).removeListeners ();
}
,反之亦然,分配听众。