2009-07-06 2 views
1

Wenn sich eine Flex-Komponente direkt bewegt, sodass sich ihre x- und y-Eigenschaften ändern, wird ein "move" -Ereignis für die Komponente ausgelöst. Das ist alles in Ordnung.Wie kann ich in Flex erkennen, wenn sich eine Komponente bewegt?

Jedoch kann eine Komponente auch als Ergebnis der Mutterkomponente Bewegungs bewegen - oder seine Mutter bewegen, und so weiter. Wenn sich eine übergeordnete Komponente nun bewegt, "bewegen" sich ihre untergeordneten Elemente einfach, ohne dass Eigenschaften geändert werden oder verschobene Ereignisse auf die untergeordneten Elemente verschoben werden. Trotzdem bewegen sich die Kinder auf dem Bildschirm. Wie können Sie diese generalisierte Bewegung erkennen?

Antwort

1

Eine Abhilfe ist, bewegen sich alle Ereignisse in der Anwendung zu erfassen:

Application.application.addEventListener 
    (MoveEvent.MOVE, handleMove, true, 0, true); 

Das dritte Argument ist erforderlich, weil Bewegungsereignisse nicht Blase, und so stattdessen erfasst werden müssen. Das vierte Argument ist unwichtig, und das fünfte Argument wendet schwache Referenzen an, was in diesem Fall eine gute Idee ist, da wir einen globalen Verweis von Application.application auf handleMove erstellen - ein Rezept für Speicherlecks.

Natürlich wird dies zu oft ausgelöst (einmal jedes Mal, wenn überhaupt etwas in der Anwendung bewegt), und in einer großen Anwendung kann zu Leistungsproblemen führen. Wenn Sie wissen, dass sich eine höher gelegene Komponente in der Hierarchie befindet, die sicher stillsteht, können Sie den Listener statt global auf diesen Punkt setzen, was das Problem verringern könnte.

Dennoch wäre es schön, einen saubereren Weg zu haben, dies zu lösen.

0

Nun, Sie haben bereits die allgemeinste Lösung vorgeschlagen, aber ich denke, dass es für das Kind möglich ist, durch Eltern/Großeltern zu gehen, bis es eine stationäre erreicht (festgelegt durch eine dynamische Eigenschaft, zumindest dies) würde Ihnen einige Schwierigkeiten ersparen, herauszufinden, welcher Elternteil welches Kind behandelt.

private function addHandlerToStationaryParent(handler:function):void 
{ 
    var currentParent:DisplayObjectContainer = parent; 
    while(currentParent != null) 
    { 
     if(currentParent["stationary"] == true) 
     { 
      currentParent.addEventListener(MoveEvent.MOVE, handler); 
      return; 
     } 
    } 
} 

Ich denke, es wäre Ihre Präferenz, ob dies eine bessere Lösung wäre oder nicht.

+0

Sie müssen True als drittes Argument für addEventListener übergeben, um die Erfassung zu aktivieren. Außerdem wäre es besser, den Ereignis-Listener einem unmittelbaren Kind des stationären Vorfahren hinzuzufügen - andernfalls riskieren Sie, Ereignisse von irrelevanten Kindern des stationären Vorfahren einzufangen. –

+0

Nun, ich habe nur einen Punkt demonstriert. – CookieOfFortune

Verwandte Themen