2012-06-04 22 views
5

Wenn ich einen EVENT.ACTIVATE Listener zu meinem Projekt hinzufüge, und dann Alt-Tab weg und zurück zu meinem Projekt wird es zweimal ausgelöst.Warum wird mein EVENT.ACTIVE zweimal ausgelöst?

bearbeiten: Shaunhusain und ich habe die Ursache des Problems gefunden, obwohl ohne eine Lösung. Wenn der Standalone Player Version 11+ ausgeführt wird, löst das Event 2x aus. Wenn die Standalone-Player-Version < 11 oder eine andere Version im Browser ausgeführt wird, wird 1x ausgelöst. Es scheint also, dass in den letzten Versionen des Flash-Player-Projektors ein Bug vorliegt. Ich werde die genauen Versionen notieren und es Adobe mitteilen und sehen, was passiert. Danke an alle, die das gelesen haben und versucht haben zu helfen !!

Ich möchte es jedes Mal feuern, wenn ich den Fokus ändere, ich will es einfach nicht schießen zweimal jedes Mal, wenn ich den Fokus ändere.

Warum ist das? Mache ich etwas falsch? Was ist der beste Weg, um dieses Verhalten zu verhindern?

Es scheint, als wäre es eine häufige Frage, aber Google hat nichts gefunden.

Code:

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

    } 

} 

Tatsächliches Ergebnis:

[object Stage] 
[object Stage] 

Wunschergebnis:

[object Stage] 

Es scheint nicht, einen Unterschied zu machen, ob ich den Hörer auf die Bühne hinzufügen oder irgendetwas anderes, das Verhalten ist das gleiche.

Das Gleiche passiert auch mit EVENT.DEACTIVATE. Andere wie Maus funktionieren gut.

Mein Ziel ist es, ein Spiel auf EVENT.DEACTIVATE zu pausieren und es auf EVENT.ACTIVATE zu pausieren. Das Problem besteht darin, dass wenn das Ereignis zweimal ausgelöst wird, es zweimal die Unpause-Funktion aufruft, was unerwünschte Konsequenzen hat.

+1

Bitte fügen Sie weitere Informationen über den Kontext hinzu, den Sie erstellen/ausführen. Ich habe gerade ein AS3-Projekt in FlashBuilder erstellt, es als eine AIR-Anwendung mit dem 4.6 SDK ausgeführt und kann nicht reproduzieren, auch ein Web versucht Anwendung mit dem 4.5 SDK kann auch nicht reproduzieren, in beiden Fällen bekomme ich das erwartete Ergebnis. – shaunhusain

+1

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

+1

Das ist in der Tat seltsam! Danke, dass du es versuchst. Ich benutze FlashDevelop 4.0.0 Beta R1978 mit Flex 4.6.0. Ich habe keinen Zugriff auf FlashBuilder, werde aber in den flashdevelop-Foren nachfragen. In der Zwischenzeit, wenn jemand flashdevelop hat, wäre es großartig, wenn Sie versuchen könnten, die Ergebnisse zu reproduzieren. – WgFunstorm

Antwort

1

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

ausgelöst, wenn der Flash Player oder AIR-Anwendung gewinnt Systemfokus erhält und aktiv wird betrieben wird. Dieses Ereignis ist ein Broadcast-Ereignis, , was bedeutet, dass es von allen EventDispatcher-Objekten mit einem für dieses Ereignis registrierten Listener ausgelöst wird. Weitere Informationen zu Broadcast-Ereignissen finden Sie in der DisplayObject-Klasse.

Für mich sieht es so aus, als ob Sie das entworfene Verhalten verhindern wollen? Ich nehme an, es wurde entwickelt, um jedes Mal zu schießen, wenn Sie den Fokus wechseln, oder liege ich falsch? Was möchten Sie erreichen? Dies ist jedoch eine Antwort, so auf das, was Sie geschrieben haben - Sie nur durch das Entfernen eines Zuhörers eine Abhilfe tun können, nachdem er einmal gefeuert:

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

     trace(e.target); 
    } 

Aber ich würde Ihnen empfehlen etwas mehr darüber, warum schreiben Sie sind es mit und was wollen Sie erreichen, wenn dies nicht zufriedenstellend ist.

+0

Ich möchte ein Spiel auf EVENT.DEACTIVATE pausieren, und dann möchte ich es auf EVENT.ACTIVATE fortsetzen. \t \t Nach dem Lesen der Dokumentation, die Sie zitiert haben, verstehe ich immer noch nicht, warum es zweimal ausgelöst wird. Ich möchte, dass es jedes Mal feuert, wenn ich den Fokus ändere, ich möchte nicht, dass es jedes Mal zweimal feuert, wenn ich den Fokus ändere. (Weil es dann die Funktion unpause() zweimal aufruft, was unerwünschte Effekte hat). \t \t Wenn ich den Ereignis-Listener gemäß Ihrem Vorschlag entfernen, wird er nicht erneut ausgelöst, wenn das nächste Mal der Fokus erreicht wird. – WgFunstorm

+0

Was ist, wenn Sie es auf DEAKTIVIEREN hinzufügen? –

+0

Hmm das ist in der Tat seltsames Verhalten, sieht aber konsistent aus, so dass man Ereignisse einfach zählen und jede Sekunde ignorieren kann. Vielleicht könnte jemand anderes das erklären. –

0

Ich hatte das gleiche Problem in meiner AIR Mobile App.

Um dieses Problem zu beheben, habe ich den letzten Ereignisnamen gespeichert, der für ein Aktivieren/Deaktivieren-Ereignis ausgelöst wurde. Wenn es zweimal hintereinander versucht wird, wird es nur mit einem return; übersprungenen

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

Zunächst beginnt der Wert von _STATE mit null, so dass erlauben sollte es sich um durch das erste Mal passieren.

Ich binde sowohl Event.ACTIVATE und Event.DEACTIVATE auf den gleichen Zuhörer, onAppStateChanged in meiner App Initialisierungsmethode, etwa so:

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

Sie das Schalter-Statement ersetzen können jedoch Sie mögen, ich persönlich bevorzuge nur Robert Penners AS3Signals (GitHub), um das Resume/Suspend-Signal über die App zu übertragen.

Verwandte Themen