为什么我的EVENT.ACTIVE会触发两次?

时间:2012-06-04 23:20:15

标签: actionscript-3

当我向项目中添加EVENT.ACTIVATE侦听器,然后alt-tab并返回到我的项目时,它会触发两次。

编辑:shaunhusain,我似乎找到了问题的原因,虽然没有解决方案。当运行独立播放器版本11+时,事件触发2x。当运行独立播放器版本< 11或浏览器中的任何版本时,它会触发1x。因此,最近版本的Flash播放器投影机可能存在错误。我要确定准确的版本并将其报告给adobe,看看会发生什么。感谢任何阅读此内容并试图提供帮助的人!

我希望每次更改焦点时都会触发,每次更改焦点时我都不希望它激发两次

这是为什么?难道我做错了什么?什么是防止这种行为的最佳方法?

这似乎是一个常见的问题,但Google没有发现任何事情。

代码:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            stage.addEventListener(Event.ACTIVATE, test);
        }

        private function test(e:Event):void
        {
            trace(e.target);
        }

    }

}

实际结果:

[object Stage]
[object Stage]

期望的结果:

[object Stage]

我是否将监听器添加到舞台或其他任何内容似乎没有区别,行为是相同的。

EVENT.DEACTIVATE也会发生同样的事情。其他如鼠标工作正常。

我的目标是暂停EVENT.DEACTIVATE上的游戏并在EVENT.ACTIVATE上取消暂停。问题是,当事件触发两次时,它会调用两次unause函数,这会产生不良后果。

2 个答案:

答案 0 :(得分:1)

ActionScript® 3.0 Reference for the Adobe® Flash® Platform says about this event:

  

Flash Player或AIR应用程序运行时调度   系统重点并变得活跃。此活动是广播活动,   这意味着它被所有EventDispatcher对象调度   为此活动注册的听众。有关的更多信息   广播事件,请参阅DisplayObject类。

对我而言,您似乎想要阻止其设计行为?我想它每次改变焦点时都会被触发,或者我错了?你想要完成什么?然而,这是一个答案,所以基于你写的内容 - 你可以通过在他解雇一次后删除一个监听器来做一个解决方法:

    private function test(e:Event):void
    {
        stage.removeEventListener(Event.ACTIVATE, test);

        trace(e.target);
    }

但我会建议你写一些关于你为什么要使用它以及如果不满意想要完成的事情。

答案 1 :(得分:0)

我的AIR Mobile应用程序中遇到了同样的问题。

要解决此问题,我已存储为Activate / Deactivate事件触发的最后一个事件名称。如果连续尝试两次,则只会跳过return;

private static function onAppStateChanged(e:Event):void {
    if (_STATE == e.type) {
        return;
    }

    _STATE =    e.type;
    switch(_STATE) {
        case Event.ACTIVATE: whenActivated.dispatch(); break;
        case Event.DEACTIVATE: whenDeactivated.dispatch(); break;
    }
}

首先,_STATE的值以 null 开头,因此应该允许它第一次通过。

我将 Event.ACTIVATE Event.DEACTIVATE 绑定到我的应用初始化方法中的同一个侦听器onAppStateChanged,如下所示:

_STAGE.addEventListener(Event.ACTIVATE, onAppStateChanged);
_STAGE.addEventListener(Event.DEACTIVATE, onAppStateChanged);

您可以替换 Switch-Statement ,但我个人更喜欢使用 Robert Penner的AS3Signals GitHub)广播简历/暂停信号整个应用程序。