Drag’n'Drop release outside des Elements

Für alle die von AS 2.0 zu AS 3.0 gewechselt sind werden die onReleaseOutside-Methode bei Drag’n'Drop-Anwendungen vermissen. Gerade bei Slider-Funktionen war diese Methode extrem wichtig. Ein Beispiel: Es wird ein Slider zum Scrollen eine Textfeldes selbst erzeugt. Ganz klar wird hier die Drag’n'Drop Funktionalität über onPress und onRelease aufgerufen.

Damit lassen grundsätzlich die wichtigsten Fälle abhandeln. Jedoch was ist, wenn der User beim Ziehen des Sliders vom MovieClip runterrutscht und somit niemals die onRelease-Funktion des Sliders aufruft? Dieses Problem lässt sich in AS 2.0 mit der onReleaseOutside-Funktion lösen. Mit dieser kann der MouseUp auch außerhalb des Drag-MovieClips abgefangen und genutzt werden.

Baut man nun die selbe Szenerie in AS 3.0 nach, gibt es hier kein ReleaseOutside mehr, was zum Problem führt, dass das gedragte Objekt solange weitergedragt wird, bis man den MouseUp direkt auf dem Objekt ausführt. Für die Nutzbarkeit ein deutliches Manko. Sollte auch während des Dragvorgangs das Drag-Objekt unter ein anderes rutschen, entfällt auch hier der MoueUp-Event:

Also muss hier ein Lösungsansatz gefunden werden der den MouseUp abfängt, egal wo der User grad mit seiner Maus ist. Zwar kann man nun für jedes Objekt abfragen, ob die Maus darüber ist und hier den MouseUp abfangen wenn zuvor ein Objekt gedragt wurde, was aber eine sehr unsaubere und aufwändige Sache ist. Eine bessere, wenn auch nicht so schöne Variante wie das alte onReleaseOutside, ist den MouseUp innerhalb der gesamten Applikation abzufangen und darüber das Dragging beenden:

Application.application.addEventListener(MouseEvent.MOUSE_UP, endDrag);

Damit gibt es nur einen Aufruf und es müssen nicht alle Objekte einzeln behandelt werden. Jedoch wäre eine ähnliche Funktionalität wie das ReleaseOutside in Flex wünschenswert.