quarta-feira, 6 de abril de 2011

Invocando Métodos no Actionscript 3.0 por Links no HTMLText

Hoje vou mostrar como invocar métodos (funções) por links diretamente no HTMLText, usando a própria tag <a/> pela propriedade HREF.

Basicamente trata-se de um protocolo que colocamos no HREF para que o Flash Player dispare o evento, e não como um link para uma nova página. Disparando um TextEvent.LINK em seu TextField.

E nesse protocolo podemos passar valores para usarmos dentro do handler do evento.

   1: <a href="event:valor genérico">link</a>


Por exemplo, podemos trocar a cor de um quadrado desenhado dinamicamente, baseado no link clicado. No valor do evento, passo a cor em hexadecial (0xFF0000) e recupero esse dado pela propriedade text do TextEvent.



   1: package
   2: {
   3:     import flash.display.Sprite;
   4:     import flash.events.TextEvent;
   5:     import flash.text.TextField;
   6:     import flash.text.TextFieldAutoSize;
   7:  
   8:     [SWF( width="490", height="200" )]
   9:  
  10:     /**
  11:      *
  12:      *
  13:      * @author Idemax Green
  14:      *         www.idemax.net
  15:      *         @idemax
  16:      *
  17:      */
  18:     public class HTMLTextASLink extends Sprite
  19:     {
  20:         public function HTMLTextASLink()
  21:         {
  22:             var meuCampoDeTexto:TextField = new TextField();
  23:  
  24:             meuCampoDeTexto.addEventListener( TextEvent.LINK, onTextLink );
  25:  
  26:             meuCampoDeTexto.autoSize = TextFieldAutoSize.LEFT;
  27:             meuCampoDeTexto.multiline = true;
  28:             meuCampoDeTexto.htmlText = 'Clique para colorir o quadrado.<br />Qual cor deseja? <a href="event:0xff0000"><b><u>Vermelho</u></b></a>, <a href="event:0x00ff33"><b><u>verde</u></b></a> ou <a href="event:0x0000ff"><b><u>azul</u></b></a>?';
  29:  
  30:             addChild( meuCampoDeTexto );
  31:         }
  32:  
  33:         protected function onTextLink( event:TextEvent ):void
  34:         {
  35:             graphics.clear();
  36:             graphics.beginFill( uint( event.text ));
  37:             graphics.drawRect( 10, 50, 100, 100 );
  38:             graphics.endFill();
  39:         }
  40:     }
  41: }

Isso pode ser útil para vários fins, como navegar internamente nas aplicações, usar deep linking com Flash / Javascript, entre outros…