terça-feira, 23 de junho de 2009

Argumentos Adicionais no Compiler


Clique na imagem para ver o argumento que resolve todos os problemas na hora de compilar um projeto.

Obs.: Testado somente no Flex SDK 3.3.

Cedido com exclusividade para esse blog pelo Mateus Pádua.

segunda-feira, 22 de junho de 2009

Criando e Disparando Eventos Customizados - 1ª Parte

Olá, esse post de hoje é o primeiro de uma série de três onde vou mostrar como se cria um evento customizado até a melhor maneira de usá-lo com argumentos customizados.

Nesse exemplo eu vou fazer um botão que gira a forma selecionada em dois RadioButtons, primeiramente vamos criar nossa classe de evento com o nome de MeuEvento que é subclasse da Event:

public class MeuEvento extends Event

E vamos crias as duas constantes que usaremos para disparar esses eventos:

public static const GIRAR_FORMA_AZUL:String     = 'girarFormaAzul';
public static const GIRAR_FORMA_VERMELHA:String = 'girarFormaVermelha';

A classe do evento customizado fica assim:

package  
{
import flash.events.Event;

/**
* ...
* @author www.idemax.net
*/
public class MeuEvento extends Event
{
public static const GIRAR_FORMA_AZUL:String = 'girarFormaAzul';
public static const GIRAR_FORMA_VERMELHA:String = 'girarFormaVermelha';

public function MeuEvento(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}

}

}

Bom, agora vamos montar o exemplo, a classe principal será a Main que é subclasse de MovieClip:

public class Main extends MovieClip

No método construtor da classe eu vou adicionar o EventListener MouseEvent.CLICK no botão:

botao.addEventListener(MouseEvent.CLICK, onClickBotao);

E também os EventListener MeuEvento.GIRAR_FORMA_AZUL e MeuEvento.GIRAR_FORMA_VERMELHA direto no STAGE:

addEventListener(MeuEvento.GIRAR_FORMA_AZUL, girarFormaAzul);
addEventListener(MeuEvento.GIRAR_FORMA_VERMELHA, girarFormaVermelha);

O método listener do MouseEvent.CLICK do botão verifica o valor do RadioButtonGroup para disparar o evento de qual forma o usuário quer girar:

private function onClickBotao(event:MouseEvent):void 
{
switch(radioButtonGroup.selection.value)
{
case 'forma1':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_AZUL));
break;
case 'forma2':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_VERMELHA));
break;
}
}

E nos métodos listeners que adicionamos no STAGE fazemos a rotação da forma que o usuário disparou o evento:

private function girarFormaAzul(event:MeuEvento):void 
{
forma1.rotation += 45;
}

private function girarFormaVermelha(event:MeuEvento):void
{
forma2.rotation -= 45;
}

Pronto! Você deve estar se perguntando o porque de usar eventos customizados nesse exemplo ou em qualquer outra explicação. Os comando de rotacionar a forma poderiam sim estar no bloco de comando de cada CASE do SWITCH ou na necessidade de usar um método genérico, executar o método ao invés de disparar o evento.

Mas o uso do evento customizado te da oportunidade de ouví-lo de onde estiver, por exemplo, ao carregar um SWF externo ele faz uma animação de 3 segundos e depois para. Como você faria isso de uma forma que não seja necessário ter um método que seja executado quando essa animação acabar?

Resposta: Você dispara um evento quando a animação acabar para que internamente você execute o que quiser e também deixa diponível para quem estiver de fora, no caso, quem carregou esse SWF. Saber quando essa animação acabou. Isso deixa seu código mais desacoplado...

Classe Main completa:

package  
{
import fl.controls.Button;
import fl.controls.CheckBox;
import fl.controls.RadioButton;
import fl.controls.RadioButtonGroup;
import flash.display.MovieClip;
import flash.events.MouseEvent;

/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
public var botao:Button;
public var radioButtonGroup:RadioButtonGroup = new RadioButtonGroup('radioButtonGroup');
public var radioButtonAzul:RadioButton;
public var radioButtonVermelho:RadioButton;
public var forma1:MovieClip;
public var forma2:MovieClip;

public function Main()
{
addEventListener(MeuEvento.GIRAR_FORMA_AZUL, girarFormaAzul);
addEventListener(MeuEvento.GIRAR_FORMA_VERMELHA, girarFormaVermelha);

botao.addEventListener(MouseEvent.CLICK, onClickBotao);
}

private function onClickBotao(event:MouseEvent):void
{
switch(radioButtonGroup.selection.value)
{
case 'forma1':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_AZUL));
break;
case 'forma2':
dispatchEvent(new MeuEvento(MeuEvento.GIRAR_FORMA_VERMELHA));
break;
}
}

private function girarFormaAzul(event:MeuEvento):void
{
forma1.rotation += 45;
}

private function girarFormaVermelha(event:MeuEvento):void
{
forma2.rotation -= 45;
}

}

}

Clique aqui para ver um exemplo ou abaixo para fazer o download dos arquivos:

quinta-feira, 4 de junho de 2009