MOUSE_OVER ou ROLL_OVER?

Eis a grande questão que muitos que começam no AS3 devem se fazer. Qual a diferença entre MOUSE_OVER e ROLL_OVER? A diferença é simples, mas muita gente não sabe, e acaba por adotar um dos dois métodos apenas, esquecendo completamente do outro. Mas ambos tem a sua verdadeira utilidade, e não usá-los corretamente pode resultar em problemas.

No antigo AS2, tínhamos apenas o bom e velho onRollOver, que era disparado sempre que o mouse entrasse na área do MovieClip. Hoje, temos o ROLL_OVER que funciona exatamente da mesma forma, e o MOUSE_OVER que funciona de um jeito um pouco diferente.

Os exemplos que vou mostrar, têm a seguinte estrutura:

  • Bola – MovieClip
    • Bolinha – MovieClip
    • Fundo – Shape

Ou seja, Bola (azul) é pai da Bolinha (preto). Os eventos foram adicionados apenas no MovieClip Bola.

Vamos dar uma olhada no comportamento do evento MouseEvent.ROLL_OVER nesses MovieClips:

The Flash plugin is required to view this object.

Perceba que ao passar o mouse sobre a área da Bola, o evento OVER dispara, e nada se altera, mesmo passando o mouse sobre a Bolinha. Ao sair da área da Bola, o evento OUT dispara. Os eventos MouseEvent.ROLL_OVER e MouseEvent.ROLL_OUT são uma forma simples de comportamento para objetos com filhos. Os filhos não interferem.

Vamos ver como a coisa fica com o evento MouseEvent.MOUSE_OVER:

The Flash plugin is required to view this object.

Bem diferente né? Quando passamos o mouse sobre a Bola, o evento MOUSE_OVER ocorre, até aí tudo normal. Agora, quando passamos o mouse sobre a Bolinha, o evento de MOUSE_OUT dispara em Bola, e o evento MOUSE_OVER dispara em Bolinha. Ué?! Não precisa estranhar não, é assim mesmo.

O que ocorre, é que os eventos MOUSE_OVER e MOUSE_OUT disparam de acordo com a área dos childs do objeto. Ou seja, sempre que o mouse passar sobre Bolinha, ele deixou de ter contato com Fundo de Bola, ocasionando o evento MOUSE_OUT em Bola e disparando o MOUSE_OVER em Bolinha.

Quando tiramos o mouse da Bolinha, ele dispara o evento MOUSE_OUT, e em seguida dispara o evento MOUSE_OVER novamente, pois entramos em contato com o Fundo. Se Fundo fosse um MovieClip, o target seria Fundo e não Bola:

The Flash plugin is required to view this object.

Veja que agora o objeto Bola nem sofre evento nenhum, apenas os filhos disparam os eventos. E neste caso, quando passamos o mouse sobre o Fundo, o alpha dele diminui, sem afetar o alpha de Bolinha, e vice-versa.

Portanto, se não existe a necessidade do evento afetar os childs, e sim apenas o objeto pai, usaremos ROLL_OVER. Mas, se quisermos diferentes comportamentos para cada child do objeto, podemos usar o MOUSE_OVER.

Referências:

2 Comments

  1. Muito legal cara eu não sabia disso, bem interessante

    Abraço!!

  2. Há, matou minha dúvida…
    Valew !!!

Leave a Comment