sábado, 18 de julho de 2009

Você conhece QR-Code?

Você é capaz de entender o que está escrito na imagem acima?!

quinta-feira, 16 de julho de 2009

Twitter do Alessandro Maraca



Arte para o background do Twitter. Como ele é vereador pelo PSDB, fiz uma analogia com as aves.

http://twitter.com/alessandromarac

quarta-feira, 15 de julho de 2009

Rotação 3D no Flash Player 10

Olá, quem me segue no Twitter, está lendo ultimamente que estou fazendo um Coverflow usando a rotação 3D nativa do Flash Player 10. Então resolvi fazer um post antes de dormir para mostrar como é fácil usar essa nova classe.

Abaixo é o teste simples que fiz no Flash:


Obs.: Caso não funcione, instale o Flash Player 10 clicando aqui.

E a classe Main:

package  
{
import fl.controls.Slider;
import fl.events.SliderEvent;
import flash.display.MovieClip;

/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
public var avatar:MovieClip;
public var xAxis:Slider;
public var yAxis:Slider;
public var zAxis:Slider;

public function Main()
{
xAxis.addEventListener(SliderEvent.CHANGE, onSliderChange);
yAxis.addEventListener(SliderEvent.CHANGE, onSliderChange);
zAxis.addEventListener(SliderEvent.CHANGE, onSliderChange);
}

private function onSliderChange(event:SliderEvent):void
{
var slider:Slider = event.target as Slider;

switch(slider)
{
case xAxis:
avatar.rotationX = slider.value;
break;
case yAxis:
avatar.rotationY = slider.value;
break;
case zAxis:
avatar.rotationZ = slider.value;
break;
}
}

}

}

Clique abaixo para fazer o download dos arquivos:

Excellent OSH





Artes para uma apresentação de slides em cd-card.

quarta-feira, 1 de julho de 2009

Criando e Disparando Eventos Customizados - 2ª Parte

Olá, continuando a sequência de posts sobre criar e disparar eventos customizados, hoje vou ensinar como colocar também propriedades customizadas. Por exemplo, você tem três elementos na tela e três botões que giram esses elementos.

Para fazer isso de uma forma que seu código não fique acoplado e você possa futuramente mudar o efeito (no caso, girar) sem estragar outras partes do código, você precisar pensar genericamente. Para isso, teoricamente seu código deve ser assim:


  1. Cada botão no MouseEvent.CLICK dispara um evento dizendo que é para girar um certo elemento.

  2. O método listener do evento que o botão disparou verifica em qual elemento deve ser feito o bloco de comandos (no caso, girar)


É ai que entra o evento customizado com propriedades customizadas. No MouseEvent ou em qualquer evento nativo do actionscript não há propriedades disponíveis para que você passe qualquer tipo de informação extra, no caso de nosso exemplo, um MovieClip.

Se você não leu o meu primeiro post sobre eventos customizados, leia-o antes clicando aqui.

Há duas maneiras de fazer isso, na verdade, um é complemento do outro. O que vou mostrar hoje é a primeira fase, para que você entenda passo à passo como funciona o processo de customizar eventos com propriedades customizadas.

Inicialmente vamos criar nossa classe de evento customizado normalmente, como criamos no post passado:

package  
{
import flash.events.Event;

/**
* ...
* @author www.idemax.net
*/
public class MeuEvento extends Event
{
public static const GIRAR_ELEMENTO:String = 'girarElemento';

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

}

}

O que muda é o seguinte, como num classe qualquer, você irá criar variáveis públicas, além das constantes usadas para disparar o seu evento:

public var instancia:String;
public var elemento:MovieClip;

Vou usar dois tipos para deixar o exemplo mais completo. No meu evento customizado eu vou poder passar a instância do MovieClip (uma String) ou o próprio MovieClip.

Então a classe do nosso evento customizado com propriedades customizadas fica assim:

package  
{
import flash.display.MovieClip;
import flash.events.Event;

/**
* ...
* @author www.idemax.net
*/
public class MeuEvento extends Event
{
public static const GIRAR_ELEMENTO:String = 'girarElemento';

public var instancia:String;
public var elemento:MovieClip;

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

}

}

Pronto, agora vamos usá-lo! Vou cria minha classe Main que escutará o evento MouseEvent.CLICK nos botões e o meu evento customizado:

public function Main() 
{
addEventListener(MeuEvento.GIRAR_ELEMENTO, onGirarElementoHandler);

btnAzul.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVerde.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVermelho.addEventListener(MouseEvent.CLICK, onBtnClick);
}

No listener onBtnClick, vou guardar qual botão está disparando esse evento pelo event.target:

var buttonClicked:Button = event.target as Button;

E vamos instanciar nosso evento customizado:

var evt:MeuEvento = new MeuEvento(MeuEvento.GIRAR_ELEMENTO);

Mas porque instânciar? A sua classe de eventos comporta-se como uma classe normal, por isso declaramos como public as propriedades customizadas.

Agora verificamos por um switch qual botão disparou o evento MouseEvent.CLICK para que seja guardado na propriedade de nosso evento customizado qual elemento ele deve girar:

switch(buttonClicked)
{
case btnAzul:
evt.elemento = azul;
break;
case btnVerde:
evt.instancia = 'verde';
break;
case btnVermelho:
evt.elemento = vermelho;
break;
}

Veja que eu acessei normalmente as propriedades "elemento" e "instancia" da classe MeuEvento. Na "elemento" eu passei o MovieClip direto, mas na "instancia" eu passei uma String com a instância do meu MovieClip.

Agora disparamos nosso evento:

dispatchEvent(evt);

O listener onBtnClick inteiro ficou assim:

private function onBtnClick(event:MouseEvent):void 
{
var buttonClicked:Button = event.target as Button;

var evt:MeuEvento = new MeuEvento(MeuEvento.GIRAR_ELEMENTO);

switch(buttonClicked)
{
case btnAzul:
evt.elemento = azul;
break;
case btnVerde:
evt.instancia = 'verde';
break;
case btnVermelho:
evt.elemento = vermelho;
break;
}

dispatchEvent(evt);
}

Como o botão já disparou o evento com o elemento que ele quer que sejá girado, vamos tratar esse evento no listener onGirarElementoHandler que adicionamos na contrutora da classe.

Primeiro vamos tratar alguns possíveis erros que podem acontecer, caso seja passado nenhum elementos nas propriedades "elemento" e "instancia" ou seja passado em ambas.

if (event.elemento == null && event.instancia == null) return; // Se não for declarado algum elemento para ser girado
if (event.elemento != null && event.instancia != null) return; // Se os dois argumentos forem declarados, deve-se escolher um

Se estiver somente um das propriedades difernte de NULL, vamos verificar qual delas foi atribuída e guadar em uma variável:

var girarElemento:MovieClip;

if (event.elemento != null)
{
girarElemento = event.elemento as MovieClip;
}
else if (event.instancia != null)
{
girarElemento = this[event.instancia as String] as MovieClip;
}

Pronto! Agora fazemos o que devemos fazer com o elemento selecionado!

girarElemento.rotation = Math.random() * 360;

O listener onGirarElementoHandler inteiro ficou assim:

private function onGirarElementoHandler(event:MeuEvento):void 
{
if (event.elemento == null && event.instancia == null) return; // Se não for declarado algum elemento para ser girado
if (event.elemento != null && event.instancia != null) return; // Se os dois argumentos forem declarados, deve-se escolher um

var girarElemento:MovieClip;

if (event.elemento != null)
{
girarElemento = event.elemento as MovieClip;
}
else if (event.instancia != null)
{
girarElemento = this[event.instancia as String] as MovieClip;
}

girarElemento.rotation = Math.random() * 360;
}

Agora você pode deixar sua aplicação mais rica e muito menos acoplada a um determido tipo de execução, e para mudar ou atualizar algum efeito ou processo, basta você mudar apenas um método!

A classe Main inteira ficou assim:

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

/**
* ...
* @author www.idemax.net
*/
public class Main extends MovieClip
{
public var vermelho:MovieClip;
public var verde:MovieClip;
public var azul:MovieClip;
public var btnVermelho:Button;
public var btnVerde:Button;
public var btnAzul:Button;

public function Main()
{
addEventListener(MeuEvento.GIRAR_ELEMENTO, onGirarElementoHandler);

btnAzul.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVerde.addEventListener(MouseEvent.CLICK, onBtnClick);
btnVermelho.addEventListener(MouseEvent.CLICK, onBtnClick);
}

private function onBtnClick(event:MouseEvent):void
{
var buttonClicked:Button = event.target as Button;

var evt:MeuEvento = new MeuEvento(MeuEvento.GIRAR_ELEMENTO);

switch(buttonClicked)
{
case btnAzul:
evt.elemento = azul;
break;
case btnVerde:
evt.instancia = 'verde';
break;
case btnVermelho:
evt.elemento = vermelho;
break;
}

dispatchEvent(evt);
}

private function onGirarElementoHandler(event:MeuEvento):void
{
if (event.elemento == null && event.instancia == null) return; // Se não for declarado algum elemento para ser girado
if (event.elemento != null && event.instancia != null) return; // Se os dois argumentos forem declarados, deve-se escolher um

var girarElemento:MovieClip;

if (event.elemento != null)
{
girarElemento = event.elemento as MovieClip;
}
else if (event.instancia != null)
{
girarElemento = this[event.instancia as String] as MovieClip;
}

girarElemento.rotation = Math.random() * 360;
}

}

}

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