2010-12-06 3 views
1

Der vereinfachte Code:Welche Flash-Ereignisse können ein mouse_up-Ereignis unterbrechen und wie erkenne ich sie?

//triggered on MouseEvent.MOUSE_DOWN 
private function beginDrag(e:MouseEvent):void 
{ 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.addEventListener(Event.DEACTIVATE, endDrag); 
    contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, endDrag); 
} 

private function drag(e:MouseEvent):void 
{ 
    //do stuff 
} 

private function endDrag(e:Event):void 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.removeEventListener(Event.DEACTIVATE, endDrag); 
    contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, endDrag); 
} 

Ich bin mit ein paar Click-and-Drag-Techniken in meinem Flash-Code, und ich habe einige Lücken mit dem MOUSE_UP Ereignis bemerkt:

  • es wird nicht ausgelöst werden wenn ein Kontextmenü aktiviert ist, während die Maus noch gedrückt gehalten wird.
  • es wird nicht ausgelöst werden, wenn das Fenster (Alt + Tab oder ähnliches) deaktiviert

Meine Frage ist: Welches andere Ereignisse können das MOUSE_UP Ereignis möglicherweise unterbrechen und zu einem unerwarteten Verhalten führen?

Zusätzlich gibt es eine Möglichkeit, ContextMenuEvent.MENU_SELECT für alle Kontextmenüs generisch abzufangen, ohne die Listener zu jedem Kontextmenü manuell hinzufügen/entfernen zu müssen?

+0

Wie und was ziehen Sie? Soll das ziehbare Objekt nur mit der Maus darüber bewegt werden oder bewegt es sich mit dem gedrückten linken btn nach dem Cursor, wohin auch immer es bewegt wird? Ich frage, weil imho für die meisten Fälle nur ein "MouseEvent.MOUSE_MOVE" Listener mit einem 'event.buttonDown' Check ist die Best Practice – www0z0k

+0

@ www0z0k anscheinend haben Sie nicht einmal meinen Code gelesen. Ich würde dir -1 auf den Kommentar geben, wenn ich könnte. Ich habe bereits die Grundlagen der Drag-down ** das ist nicht das Problem ** das Problem ist, wenn einige externe Ereignis ausgelöst wird, die verhindert, dass das Ereignis 'MOUSE_UP' von Flash aufgefangen wird. – zzzzBov

+0

Ich würde besser eine Antwort posten;) 'Event.MOUSE_LEAVE' wird ausgelöst, wenn das Kontextmenü aufgerufen wird, wenn die Maus mit linkem btn freigegeben die Bühne verlässt oder wenn btn freigegeben wird, wenn Maus von der Bühne – www0z0k

Antwort

0

es möglich sein kann für die Event.REMOVED_FROM_STAGE oder Event.REMOVED Ereignisse, wenn das Feuer kompiliertes swf ist ein Kind eines anderen swf. Ich glaube an dieses Szenario, auf das Stadium des besitzenden Dokuments wird verwiesen, und deshalb immer noch kein Problem.

FocusEvent.FOCUS_OUT nicht ausgelöst, bis nach der Benutzer Sie die Maus lassen hat, die das MouseEvent.MOUSE_UP Ereignis auslösen würde.

Es scheint, dass mein ursprünglicher Code gut genug funktioniert. (Es besteht die Möglichkeit einer Lücke, wenn das Kontextmenü eines Unterelements ausgelöst wird).

1

this code might help
i kommentierte heraus alles unnesesary mit /* */
Sie sehr willkommen, diesen Code zu aktualisieren, wenn es nicht Ihre Situation passt

+0

@ www0z0k ist Code funktioniert ** schlimmer ** als was ich * benutze *.Wenn ich die linke Maustaste gedrückt halte, während ich auf der Bühne stehe, und dann mit der rechten Maustaste klicke, erscheint das Kontextmenü, und das Kontextmenü wird beendet (wenn ich außerhalb der Bühne klicke), bleibt das blaue Objekt trotzdem an der Maus hängen Halten Sie nicht länger die linke Maustaste gedrückt. Es ist diese spezifische Art von Problem, die ich beheben wollte. – zzzzBov

+0

@zzzzBov versucht derzeit, es zu beheben. alles andere falsch in meinem Code? – www0z0k

+0

@zzzzBov aktualisiert meinen Code mit ein paar Veranstaltungen, könnten Sie bitte überprüfen? – www0z0k

-1

Es ist ein großes Problem mit MOUSE_LEAVE: Wenn Sie die Maus nach unten, dann gehalten haben MOUSE_LEAVEis not fired.

Dies ist, was ich MOUSE_LEAVE während eines Drag zu simulieren tun. Glücklicherweise werden die stage.mouseX und stage.mouseY aktualisiert, während die Maus noch nicht aktiv ist. Wahrscheinlich benötigen Sie für bestimmte Browser auch MOUSE_LEAVE.

public function beginDrag(evt:MouseEvent):void 
    { 
     stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
     stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
     stage.addEventListener(Event.DEACTIVATE, endDrag); 
     stage.addEventListener(Event.MOUSE_LEAVE, endDrag); 

     _dragging = true; 
    } 

    public function drag(evt:MouseEvent):void 
    {   
     // check if mouse has fallen off stage 
     if (stage.mouseX < 0 || 
      stage.mouseY < 0 || 
      stage.mouseX > stage.stageWidth || 
      stage.mouseY > stage.stageHeight) 
     { 
      endDrag(evt); 
      ExternalInterface.call("alert", "Dropped off"); 
      return; 
     } 

     // do drag stuff here... 
    } 
+0

Sie haben offensichtlich den Zweck von 'MOUSE_LEAVE' missverstanden. Wenn ein Benutzer die Maus gedrückt hält, wird das mouse_move-Ereignis normalerweise ausgelöst (es gibt ein Problem, wenn wmode undurchsichtig oder transparent ist), und Sie können weiter ziehen, obwohl sich die Maus nicht mehr über der Bühne befindet. Meine Frage war speziell über das Unterbrechen des 'MOUSE_UP' Ereignisses und * nicht * über' MOUSE_LEAVE'. – zzzzBov

+0

@zzzzBov - also meinst du nicht, ich habe deine Frage missverstanden ;-) Ich denke, was ich über MOUSE_LEAVE gesagt habe, ist wahr –

+0

'MOUSE_LEAVE' wurde entworfen, um * nicht * zu schießen, wenn du die Bühne mit gedrückter Maustaste verlässt. Es wird ausgelöst, wenn die Maus freigegeben wird (mit Ausnahme des wmode-Fehlers in einigen Browsern). Es ist nicht als 'MOUSE_OUT' Ersatz gedacht. Sie werden bemerken, dass es kein 'MouseEvent' ist. – zzzzBov

Verwandte Themen