2012-06-04 107 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)在應用程序中廣播恢復/暫停信號。

相關問題