2009-09-09 11 views
0

Il s'agit d'une situation où je rencontre beaucoup de difficultés, mais qui ne semble jamais trouver une bonne solution. J'ai des clips que je redimensionne légèrement sur le rollover, mais si vous passez la souris sur le bord du MovieClip, il se trouve juste là et scintille, en recevant continuellement des événements mouseOver et mouseOut. Comment gérez-vous cela? Encore une fois, c'est généralement un problème lorsqu'on interpole l'échelle d'un MovieClip ou d'un bouton.as3 - contrôler le scintillement lors de la mise à l'échelle d'un bouton ou d'un MovieClip

my_mc.addEventListener(MouseEvent.MOUSE_OVER, mOver); 
my_mc.addEventListener(MouseEvent.MOUSE_OUT, mOut); 

private function mOver(m:MouseEvent) {    
    TweenLite.to(m.target, .2, { scaleX:1.1, scaleY:1.1}); 
} 

private function mOut(m:MouseEvent) { 
    TweenLite.to(m.target, .2, { scaleX:1, scaleY:1}); 
} 

Répondre

1

Je sais ce que vous entendez: l'animation elle-même génère des événements indésirables d'entrée que le clip se développe/contrats amenant le curseur sur ou hors de la zone hitTest redimensionné du clip.

Couple d'idées:

  1. Overlay Un sprite clair pour agir en tant que zone de bouton et échelle un autre objet enfant contenant le contenu.
  2. (Plus simple) Supprimez les gestionnaires d'événements pendant la transition, en les rajoutant dans une fonction de rappel déclenchée par la propriété onComplete.
    L'objet dont les événements d'entrée souris sont déclenchés reste de taille constante. de l'objet d'animation TweenLite:
my_mc.addEventListener(MouseEvent.MOUSE_OVER, _animate); 
my_mc.addEventListener(MouseEvent.MOUSE_OUT, _animate); 

private function _animate(event:MouseEvent):void 
{ 
    var mc:Sprite = event.target as Sprite;   
    var animScale:Number = (event.type == MouseEvent.MOUSE_OVER) ? 2 : 1; 

    TweenLite.to(mc, 0.5, { 
     onStart: function():void { 
      mc.removeEventListener(MouseEvent.MOUSE_OVER, _animate); 
      mc.removeEventListener(MouseEvent.MOUSE_OUT, _animate); 
     }, 
     scaleX: animScale, 
     scaleY: animScale, 
     onComplete: function():void { 
      mc.addEventListener(MouseEvent.MOUSE_OVER, _animate); 
      mc.addEventListener(MouseEvent.MOUSE_OUT, _animate); 
     } 
    }); 
} 
+0

J'ai essayé le code affiché. Rien ne se passe au survol, et _anime est appelé deux fois immédiatement. –

+0

Peut-être aurais-je dû dire explicitement que c'était du pseudo-code, mais je n'avais pas réalisé que vous n'essaieriez pas de développer votre propre implémentation en fonction de l'idée générale que j'ai fournie. Il s'avère que le problème était un comportement étrange de définir la propriété mouseEnabled dans le gestionnaire _animate. Je l'ai changé pour qu'il arrête simplement d'écouter les événements pendant la transition. –