5

当我EVENT.ACTIVATE向我的项目添加一个监听器,然后 alt-tab 离开并返回我的项目时,它会触发两次。

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

我希望每次改变焦点时它都会触发,我只是不希望每次改变焦点时它都会触发两次。

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

这似乎是一个常见的问题,但谷歌什么也没找到。

代码:

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。问题是当事件触发两次时,它会调用 unpause 函数两次,这会产生不必要的后果。

4

2 回答 2

1

Adobe® Flash® 平台的 ActionScript® 3.0 参考对这一事件进行了说明:

当 Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时调度。此事件是一个广播事件,这意味着它由所有具有为此事件注册的侦听器的 EventDispatcher 对象调度。有关广播事件的详细信息,请参阅 DisplayObject 类。

对我来说,您似乎想阻止其设计行为?我想它的设计目的是在您每次改变焦点时触发,还是我错了?你想要完成什么?但是,这是一个答案,因此根据您所写的内容-您可以通过在他触发一次后删除侦听器来解决此问题:

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

        trace(e.target);
    }

但是我建议你写更多关于你为什么使用它以及如果这不令人满意的话想要完成的事情。

于 2012-06-04T23:55:29.837 回答
0

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

为了更正此问题,我存储了为激活/停用事件触发的最后一个事件名称。如果连续尝试两次,它只会被跳过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.ACTIVATEEvent.DEACTIVATE绑定到同一个侦听器,如下所示:onAppStateChanged

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

您可以随意替换Switch-Statement,我个人更喜欢使用Robert Penner 的 AS3Signals ( GitHub ) 在整个应用程序中广播恢复/暂停信号。

于 2012-12-03T18:52:21.767 回答