2011-03-25 3 views
0

J'ai un événement de déplacement personnalisé qui fonctionne très bien pour la plupart des choses:Comment détecter Event.MOUSE_LEAVE lorsque wmode = opaque ou transparent wmode =

stage.addEventListener(MouseEvent.MOUSE_DOWN, beginDrag); 

function beginDrag(e:MouseEvent) 
{ 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.addEventListener(MouseEvent.DEACTIVATE, endDrag); 
    stage.addEventListener(Event.MOUSE_LEAVE, endDrag); 
    stage.addEventListener(Event.REMOVED_FROM_STAGE, stageEndDrag); 

    //trigger beginDrag event 
} 
function drag(e:MouseEvent) 
{ 
    //trigger drag event 
} 
function endDrag(e:Event) 
{ 
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag); 
    stage.removeEventListener(MouseEvent.DEACTIVATE, endDrag); 
    stage.removeEventListener(Event.MOUSE_LEAVE, endDrag); 
    stage.removeEventListener(Event.REMOVED_FROM_STAGE, stageEndDrag); 

    //trigger endDrag event 
} 

Le problème est que lorsque j'utilise ce code avec wmode=transparent ou wmode=opaque l'événement MOUSE_LEAVE n'est pas détecté lorsque l'événement MOUSE_UP se produit hors scène.

Y at-il un moyen de détecter l'événement MOUSE_LEAVE lorsque wmode est transparent ou opaque?

OU

est-il un moyen de détecter que le wmode est réglé sur transparent ou opaque de sorte qu'un travail autour peut être mis en œuvre?

Répondre

0

Par défaut, MOUSE_LEAVE n'est pas un événement fiable. Parfois, il se fait virer, d'autres fois non. Vous pouvez find complaints about this partout sur le Web.

Il y a une chose que vous pouvez faire, cependant, et qui est de vérifier manuellement si la souris est sur la scène:

var out : Boolean = false; 

stage.addEventListener (Event.ENTER_FRAME, checkMouse); 

function checkMouse (ev:Event) : void { 
    if (
     stage.mouseX < 0 || 
     stage.mouseX > stage.stageWidth || 
     stage.mouseY < 0 || 
     stage.mouseY > stage.stageHeight) 
    { 
     if (!out) 
     { 
      out = true; 
      stage.dispatchEvent (new Event(Event.MOUSE_LEAVE)); 
     } 
    } 
    else if (out) 
    { 
     out = false; 
     stage.dispatchEvent (new Event("mouseEnter")); 
    } 
} 

Ce dépêchera l'événement MOUSE_LEAVE lorsque le curseur se trouve en dehors de la zone de scène , et l'événement "mouseEnter" personnalisé, quand il rentre. Vous pouvez ensuite ajouter des écouteurs d'événement à la scène pour réagir de manière fiable à ces événements, mais vous devez garder à l'esprit que plus d'une MOUSE_LEAVE peut être déclenchée à la fois (si la fonction personnalisée et la version intégrée sont exécutées). Vous pouvez vérifier la variable out pour empêcher la double exécution des gestionnaires d'événements.

P.S. Je ne suis pas sûr que cela fonctionne pour toutes les options stage.align et stage.scaleMode. Cela devrait fonctionner pour la combinaison de StageScaleMode.NO_SCALE et StageAlign.TOP_LEFT, pour tous les autres paramètres que vous devrez vérifier et éventuellement trouver une solution de contournement.

+0

@weltraumpirat Je n'avais jamais trouvé que l'événement 'MOUSE_LEAVE' ne soit pas fiable avant cela. Beaucoup de gens sont confus quant à * quand * l'événement 'MOUSE_LEAVE' est déclenché, comme cela arrive quand l'événement' MOUSE_UP' se produit * après que * la souris ait quitté la scène pendant que l'utilisateur fait glisser la souris. J'ai découvert que les événements de la souris ne sont pas gérés lorsque la souris est hors de la scène dans 'wmode = transparent/opaque', donc cette méthode ne fonctionnera probablement pas (même si je vais quand même essayer). – zzzzBov

+0

Si vous rencontrez des problèmes avec cela, vous pouvez toujours utiliser un écouteur ENTER_FRAME à la place. Je préfère utiliser MOUSE_MOVE si je le peux, car il n'est pas utilisé aussi souvent. – weltraumpirat

+0

@weltraumpirat, Aucun des événements souris n'est déclenché lorsque la souris quitte la scène (pas même l'événement 'MOUSE_OUT'). Si la souris a été relâchée ou enfoncée, les nouveaux événements de souris n'enregistrent pas non plus la valeur correcte pour 'buttonDown'. Je ne vois pas comment un écouteur 'ENTER_FRAME' pourrait aider. – zzzzBov

Questions connexes