rollOver/rollOut vs mouseOver/mouseOut
Par Cédric Tabin le jeudi 13.03.2008, 00:22 - ActionScript - Lien permanent
En AS3, tous les objets héritant de la classe InteractiveObject gèrent quatre événements intéressants : MouseEvent.ROLL_OVER (ou ROLL_OUT) et MouseEvent.MOUSE_OVER (ou MOUSE_OUT). A la première lecture de la documentation, la différence peut paraître assez subtile et pas franchement claire... Une petite explication par l'exemple s'impose !
Pour commencer, voici le décor :
Mon animation se compose en 3 clips :
- Un clip contenant le carré gris clair
- Un clip contenant le carré gris foncé
- Un clip contenant les deux
Ensuite, le code au niveau de la scène principale afin d'écouter les événements (cf Bubbling Events) :
function listen(evt:MouseEvent):void { var type:String = evt.type; var target:MovieClip = evt.target as MovieClip; trace(type+" - "+target.name); } clipContainer.addEventListener(MouseEvent.MOUSE_OVER, listen); clipContainer.addEventListener(MouseEvent.MOUSE_OUT, listen);
Une fois compilé, pour tester correctement la chose, je passe la souris sur le carré gris clair et la fais glisser sur le carré gris foncé. Voici ce que donne la fenêtre de sortie :
mouseOver - clipGrisClair mouseOut - clipGrisClair mouseOver - clipGrisFonce mouseOut - clipGrisFonce
Grâce au Bubbling Events, la fonction a pu détecter exactement quel clip était survolé à quel moment. Cela est très pratique (pas besoin de mettre un écouteur sur chacun des clips) ! Toutefois, il y a des cas ou ce genre de comportement ne convient pas... Voici donc ce qu'il se passe avec le même bout de code légèrement modifié :
function listen(evt:MouseEvent):void { var type:String = evt.type; var target:MovieClip = evt.target as MovieClip; trace(type+" - "+target.name); } clipContainer.addEventListener(MouseEvent.ROLL_OVER, listen); clipContainer.addEventListener(MouseEvent.ROLL_OUT, listen);
A noter que seul le type d'événement écouté a changé. Dès lors, en faisant exactement le même mouvement qu'auparavant, la sortie suivante est affichée :
rollOver - clipContainer rollOut - clipContainer
Cette fois, le changement de clip survolé (gris clair ou gris foncé) n'est pas "détecté", seule l'entrée et la sortie de la souris sur le clip container est notifiée. Et cela fait une énorme différence selon les cas à gérer !!! Pour récapituler :
- MOUSER_OVER et MOUSE_OUT notifie chaque clip survolé par la souris
- ROLL_OVER et ROLL_OUT notifie uniquement le survol du clip écouté (indépendamment des clips à l'intérieur)
Pour bien le montrer, j'ai également mis les sources d'un slider (très light) d'image : afin de gérer l'animation de chacune des images qui défilent, l'événement MouseEvent.MOUSE_OVER est utilisé, et pour le défilement, c'est l'événement MouseEvent.ROLL_OVER. Il y a encore quelques autres fioritures de code pour s'amuser, mais le principe est la !
Commentaires
Hello,
Merci pour ces explications, je ne savais pas qu'on pouvait cibler les elements situé dans un contener en mettant un evenement sur le contener. C'est super pratique !!!
Cela dit, je ne vois pas dans quel cas il serait plus judicieux d'utiliser ROLL_OVER puisqu'il est tout a fait possible de cibler le contener via MOUSE_OVER.
Aurais tu un exemple das lequel il est necessaire d'utiliser ROLL_OVER plutot que MOUSE_OVER ?
Merci d'avance !
Salut,
Ben justement, il y a un choix à affectuer qui dépend de ton projet. Regarde le slider que j'ai mis en exemple Le fait est que tu dois gérer plusieurs événements qui se passent au sein du même container : l'animation de chacune des images et leur défilement !
Si tu utilises un MOUSE_OVER pour le défilement, tu vas avoir le souci que tu vas avoir pleins d'événements générés alors que la souris est toujours dans le container
@++
Salut Cédric,
pour apporter une petite information complémentaire, les events ROLL_OVER et ROLL_OUT ne se propagent pas en bubbling, ce qui explique ce comportement.
Yep merci pour la précision dada
Il est cependant possible d'utiliser la phase de capture avec les rollOver, et on obtient le meme comportement qu'avec les mouseOver, a savoir cibler un clip dans son conteneur, les MouseEvent etant posés sur le conteneur.
Juste un petit message pour te dire un GRAND merci. J'étais complètement bloqué à cause d'un mouse_over qui devait être un roll_over. Alors merci !!!
Merci pour ces précisions concernant les 4 événements mais j'aimerais ajouter qu'il est possible de cibler le conteneur en utilisant la propriété :
"clip_conteneur.mouseChildren = false;" lors de l'utilisation des événements : "Mouse.MOUSE_OVER" et "Mouse.MOUSE_OUT".