在Actionscript中暂停按钮的最佳实践3

时间:2009-10-04 04:24:21

标签: actionscript-3 button addeventlistener

是否有更好的方法来设置具有大量导航的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;

  }

}

等等。这不是很好,感觉好像我必须点击每个按钮两次才能使它工作。

我仍然需要在两次操作之间暂停事件监听器。

4 个答案:

答案 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_NewactiveButton_Last等变量中可以存储它们的数值。

并且,是的,它们都应该在一个数组中,因此分配/删除它们变得相当容易,如下所示:

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

,反之亦然,分配听众。