2010-01-05 3 views
2

Je développe un site web avec des éléments nav qui couvrent toute la scène de haut en bas (voir image modifiée ci-dessous) et il est assez facile pour l'utilisateur de quitter la scène avec sa souris , ne déclenche pas les événements MouseEvent.MOUSE_OUT nécessaires pour "désactiver" les éléments de nav.AS3: MOUSE_OUT ne se déclenche pas lorsque la souris quitte la scène

Dois-je utiliser Event.MOUSE_LEAVE pour détecter le moment où la souris a quitté la scène et désactiver les éléments nav activés? C'est ce que j'essayais de faire, mais j'ai eu du mal à obtenir un résultat de mon auditeur. Des idées?

alt text http://marcysutton.com/blog/wp-content/uploads/2010/01/redpropeller.png

Pour une classe associée à un MovieClip dans l'IDE Flash, est-ce la syntaxe correcte pour l'enregistrement d'un auditeur Event.MOUSE_LEAVE? Ça ne semble pas faire quoi que ce soit quoi que je fasse. Est-ce un cas où je dois intégrer le film dans un navigateur pour que l'événement se déclenche?

this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener); 

Voici ma MainNav.as classe:

package com.redpropeller { 

import com.greensock.*; 
import com.greensock.plugins.*; 
import flash.display.*; 
import flash.text.*; 
import flash.events.*; 

public class MainNav extends MovieClip { // MainNav is a movieclip in the IDE 

    public var colors:Array; 

    public function MainNav():void { 
     colors = new Array(0xee3124, 0xc72a1f, 0xa62c24, 0x912923, 0x7e221c); 
     TweenPlugin.activate([TintPlugin]); 

     // trying to target stage through this object 
     this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener); 

     for(var i:Number=0; i<this.numChildren; i++){ 
      var n = this.getChildAt(i); 
      n.useHandCursor = true; 
      n.buttonMode = true; 

      n.addEventListener(MouseEvent.MOUSE_OVER, navBtnOn); 
      n.addEventListener(MouseEvent.MOUSE_OUT, navBtnOff); 
     } 
    } 
    public function mouseLeaveListener(e:Event):void { 
     trace('mouseleave'); // nothing ever happens 

    } 
    private function navBtnOn(e:MouseEvent):void { 
     TweenLite.to(e.currentTarget.bar_mc, 0.01, {tint:0x333333}); 
    } 
    private function navBtnOff(e:MouseEvent):void { 
     TweenLite.to(e.currentTarget.bar_mc, 0.01, 
      {tint:uint(colors[this.getChildIndex(MovieClip(e.currentTarget))])}); 
      // changes color back to specific tint 
    } 
} 

} 
+0

qu'est-ce que c'est avec ce graphique? votre service d'hébergement est-il revenu à une photo aléatoire? – jedierikb

+0

Je me sentais bizarre de poster le design avant que le site ne soit lancé .... remplacé par un meilleur graphique. –

Répondre

0

Vous essayez de créer l'écouteur d'événement pour MOUSE_LEAVE dans le constructeur. Il est possible que l'objet stage n'existe pas encore si MainNav n'a pas été ajouté à la scène via une méthode addChild(). Si MainNav est déjà sur scène au moment de la conception, il est toujours possible que cette scène ne soit pas disponible immédiatement. Pour les classes qui héritent de DisplayObject (MovieClip, Sprite, etc.), je ne fais qu'une chose dans le constructeur: mettre en place un écouteur Event.ADDED_TO_STAGE. Cet écouteur déclenche une méthode init() lorsque l'objet a été ajouté à la pile d'affichage de la scène via addChild() à partir d'un conteneur parent ou si l'objet est déjà sur la scène au moment du design. Quand ma méthode init() est appelée, je sais que la propriété stage sera disponible.

Dans votre constructeur, la scène peut ne pas encore exister dans l'instance, mais vous devriez obtenir une erreur d'exécution. Cependant, vous utilisez le mot clé "this" avant la scène. Lorsque vous utilisez 'this' dans une classe qui hérite de Object (votre classe le fait via MovieClip-> DisplayObject-> EventDispatcher-> Object), le compilateur ne lancera pas d'erreur si la propriété n'existe pas car elle tente de créer cette propriété en tant que membre de «ceci». Cela arrive parce que la classe Object est dynamique, ce qui signifie que de nouvelles propriétés peuvent être créées à tout moment sans avoir à les déclarer comme variables de classe dans l'en-tête - il suffit d'utiliser le mot clé 'this' pour utiliser cette propriété dynamique. Lorsque vous utilisez this.stage, si stage n'existe pas, la classe crée l'étape de propriété pour vous. Cependant, ce n'est pas l'étape que vous voulez, donc l'auditeur s'attache juste à un objet vide qui ne fait rien. Essayez de supprimer 'ceci' lors du référencement de la scène et je suis sûr que vous verrez l'erreur à un moment donné. En général, il n'est pas recommandé d'utiliser 'this' pour les propriétés, car le compilateur ignore les erreurs de type pour cette propriété.

Vous mentionnez dans un commentaire ci-dessus que MOUSE_LEAVE ne fonctionne pas dans l'EDI, mais j'ai testé cela à partir de CS4 et cela fonctionne. Vous pouvez être témoin d'une différence de performance de Flash Player de l'IDE par rapport au plugin Flash Player du navigateur. Dans certains cas, votre écouteur d'événement d'étape travaillera à partir du constructeur si le fichier SWF se charge rapidement et que l'étape est disponible immédiatement, mais ce n'est pas fiable. Déplacez cet écouteur vers une méthode init() appelée après l'événement ADDED_TO_STAGE et n'utilisez pas le mot clé 'this'.

1

Réponse: Event.MOUSE_LEAVE ne se déclenche pas dans l'IDE. Cela fonctionne correctement lorsque le film est incorporé dans une page HTML. Merci de votre aide!

+0

Quelle version de Flash utilisez-vous?J'ai testé à la fois CS3 et CS4 et cela fonctionne bien pour moi dans l'IDE. – sberry

+0

Flash CS3 ... mais même dans un swf nu et une classe Document simple, je n'ai pas de sortie. Mais une fois que j'ai téléchargé mon fichier sur le web, mes événements MouseEvent.MOUSE_OUT se sont déclenchés, éliminant le besoin de Event.MOUSE_LEAVE. –

+0

Je peux vérifier que cela ne fonctionne pas pour moi dans l'IDE non plus. J'utilise CS4 10.0.2 sur OS X 10.6.3 –

Questions connexes