Uma das primeiras diferenças que as pessoas que estão começando a desenvolver em AS3 irão notar é a forma como invocar ações de botões e movieClips. Os eventos de “onPress” e outros não existem mais. Agora tudo é feito utilizando listeners.



Neste post vou dar uma dica importante: como passar parâmetros dentro de um listener em AS3. Veja o código abaixo:



Observe o mesmo listener só que agora passando dois parâmetros à função “imprime”.

Claro que este exemplo não é o melhor para a aplicação de passagem de parâmetros através de listeners. É mais um exemplo didático mesmo.

Baixe aqui o código-fonte.


Tags: , ,

8 respostas

  1. André Rambor says:

    Oi Flávio, muito bom o teu post mas fiquei com uma dúvida. Se dentro da função eu precisar dos parâmetros que estão na variável “e:MouseEvent”… como eu faço para obtê-los?

    Mais uma vez parabéns.

  2. Olá André, primeiramente obrigado pelos elogios.
    Se você quiser utilizar as propriedades da variável “e” do evento do mouse, basta passar a mesma como parâmetro da seguinte forma:

    imprime_btn.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent){imprime(e,“Flávio Mikami”,27)});

    function imprime(e:MouseEvent,_nome:String,_idade:uint):void{
    trace(e.target.label);
    trace(“Nome: “+_nome+” | idade: “+_idade);
    }

    Espero que tenha ajudado.
    Abraços.

  3. André Rambor says:

    Bom, alguma coisa que eu não consegui identificar deve estar errada no meu código, eu realmente não consegui dessa forma mas acabei conseguindo desta:

    bot1.bot1.addEventListener(MouseEvent.CLICK, function(me:MouseEvent){carrega(“primeiro.swf”, me.target.name)});
    e depois:
    function carrega(teste:String, me):void

    Bom, mas como o que importa é atingir o resultado desejado tá valendo. E mais uma vez obrigado, fiz um curso aqui em Porto Alegre em uma das melhores (se não a melhor) escolas da região e simplesmente não vi nada sobre passar parâmetros para uma função muito menos por um Listener. Graças ao teu tópico reduzi um código de umas 215 linhas para 35 linhas. hehe
    Mais uma vez parabéns.

  4. admin says:

    Oi André, se quiser te mando o código, sem problemas.
    Mas é isso mesmo que você fez.
    Basta passar a variável de MouseEvent na função do EventListener como parâmetro e depois na função externa inserir a mesma como parâmetro a ser recebido.
    Abs!

  5. Salvou cara. Estou migrando do AS2 pro AS3 e tava apanhando pra fazer um simples mouse over!

    Valeu!

  6. Eduardo says:

    Oi Flávio.
    tentei passar parametro pra função dentro de um loop, passando dessa forma:
    rodovia270[i].marcador.addEventListener(MouseEvent.MOUSE_OVER,function(e:MouseEvent){mostra270(i)});

    Meu loop vai de zero a dois e dando um trace dentro da função ele mostra o numero trêz.

    minha função:
    function mostra270(k:int):void{
    trace(“Mostra: “+k);
    rodovia270[k].tooltipe.visible = true;
    }

    existe alguma regra pra isso?

  7. admin says:

    Olá Eduardo,

    Realmente isso acontece no Flash, ele não guarda o índice passado dentro de funções no loop.
    Como estou na correria e para te ajudar de imediato, vou te passar um jeito fácil de resolver isso, não sei se é a melhor.


    for(var i:int=0; i < 3; i++){
    this["teste"+i+"_btn"].addEventListener(MouseEvent.ROLL_OVER, function(e:MouseEvent){mostra(e.target.name)});
    }

    function mostra(nome:String):void{
    trace(nome.charAt(5));
    }

    Ao invés de passar o índice dentro da função do Listener, passe o nome de instância do objeto.
    No meu caso, criei os seguintes nomes de instância: "teste0_btn", "teste1_btn" e "teste2_btn".
    Com isso, na função mostra eu trato e consigo pegar exatamente o índice desejado.
    Se precisar usar como número, basta converter: Number(nome.charAt(5))

    Vou te mandar o FLA por e-mail.

    Espero que tenha ajudado.

    Abraços.

  8. Eduardo says:

    Flávio, consegui de uma outra forma, coloquei o addeventlistener dentro de uma função bombada(onde encontrei achei com esse nome). ficou assim:
    (function(i){
    rodovia[i].marcador.addEventListener(MouseEvent.MOUSE_OVER,function(e:MouseEvent){mostra(i)});
    rodovia[i].marcador.addEventListener(MouseEvent.MOUSE_OUT,function(e:MouseEvent){oculta(i)});
    })(i);

    coloquei isso dentro do loop e funciona perfeitamente.

    Fica a dica.

    abraços.

Faça um comentário

OBS: Comentários moderados pelo admnistrador do blog.