2012-06-04 110 views
5

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

编辑:shaunhusain和我似乎已经找到了问题的原因,虽然没有解决方案。当运行独立播放器版本11+时,事件触发2倍。当在浏览器中运行独立播放器版本<或任何版本时,它会触发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上取消暂停游戏。问题是,当事件触发两次时,它将两次调用非暂停函数,这会产生不必要的后果。

+1

请添加更多关于您正在构建/运行的上下文的信息。我刚刚在FlashBuilder中创建了一个AS3项目,告诉它使用4.6 SDK作为AIR应用程序运行,并且无法重现,也尝试了Web 4.5 SDK的应用程序也无法重现,在这两种情况下,我都可以得到预期的结果。 – shaunhusain

+1

http://www.shaunhusain.com/CheckActiveEventWeb/ http://www.shaunhusain.com/CheckActiveEventWeb/srcview – shaunhusain

+1

确实很奇怪!感谢您的尝试。我使用Flex 4.6.0的FlashDevelop 4.0.0 Beta R1978。我无法访问FlashBuilder,但会询问flashdevelop论坛。与此同时,如果任何人有flashdevelop,如果你可以尝试重现结果,那将是非常棒的。 – WgFunstorm

回答

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); 
    } 

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

+0

我想在EVENT.DEACTIVATE上暂停一个游戏,然后我想在EVENT.ACTIVATE上继续它。 \t \t 在阅读您引用的文档后,我仍然不明白为什么它会触发两次。每当我改变焦点时,我都希望它能够射击,每当我改变焦点时,我都不想让它射击两次。 (因为它然后调用两次具有不需要的效果的unpause()函数)。 \t \t 如果我根据您的建议删除事件侦听器,那么下次获得焦点时它不会再次触发。 – WgFunstorm

+0

如果您将其添加到DEACTIVATE中,该怎么办? –

+0

嗯,这确实是奇怪的行为,但看起来一致,所以你可以只计数事件,忽略每一秒。也许别人能够解释这一点。 –

0

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

要解决此问题,我已存储为激活/停用事件触发的最后一个事件名称。如果连续两次尝试,它只是被用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的价值开始,所以应该允许它通过在第一时间周围。

我地结合Event.ACTIVATE和我的应用程序的初始化方法Event.DEACTIVATE相同的听众,onAppStateChanged,就像这样:

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

,可随时更换switch语句然而,你喜欢,我个人更喜欢使用Robert Penner的AS3SignalsGitHub)在应用程序中广播恢复/暂停信号。

相关问题