DClick

A criação de estilos customizados é essencial para a produção de novos componentes.


A forma mais simples de se criar estilos customizados nos componentes do flex de forma que possamos definir estes estilos em um CSS e que tenhamos valores defaults corretamente definidos possivelmente é esta:

Actionscript:
  1. package
  2. {
  3.     import mx.styles.StyleManager;
  4.     import mx.styles.CSSStyleDeclaration;
  5.     import mx.core.UIComponent;
  6.     import flash.geom.Matrix;
  7.     import flash.filters.GradientGlowFilter;
  8.     import flash.display.GradientType;
  9.    
  10.     //nosso estilo criado
  11.     [Style(name="faixasLaranjas",type="Boolean",inherit="no" enumeration="true,false")]
  12.    
  13.     //extende UIComponent que é um Sprite.
  14.     public class ClasseExemplo extends UIComponent
  15.     {
  16.         //flag que indica se algum novo estilo foi criado.
  17.         private static var classeCriada:Boolean = criarClasse();
  18.        
  19.         //propriedade que conterá os dados do estilo.
  20.         private var _faixasLaranjas:Boolean;
  21.         private var estiloMudou:Boolean = false;
  22.        
  23.         private static function criarClasse():Boolean
  24.         {
  25.             if (!StyleManager.getStyleDeclaration("ClasseExemplo"))//se ainda não existe a declaração de estilo...
  26.             {
  27.                 var novoEstilo:CSSStyleDeclaration = new CSSStyleDeclaration();
  28.                     novoEstilo.setStyle("faixasLaranjas", true);
  29.                     StyleManager.setStyleDeclaration("ClasseExemplo", novoEstilo, true);
  30.             }
  31.             return true;
  32.         }
  33.        
  34.         /*
  35.         Override do método styleChanged dos UIComponents.
  36.         Este método é chamado se algum estilo for modificado.
  37.         */
  38.         override public function styleChanged(propriedade:String):void
  39.         {
  40.             super.styleChanged(propriedade);
  41.            
  42.             // Verifica se o estilo alterado foi o estilo faixasLaranjas.
  43.             if (styleProp=="faixasLaranjas")
  44.             {
  45.                 estiloMudou = true;
  46.                
  47.                 //obriga o componente a re-renderizar sua lista de DisplayObjects (filhos).
  48.                 invalidateDisplayList();
  49.                 return;
  50.             }
  51.         }
  52.        
  53.         /*
  54.         Override do método updateDisplayList dos UIComponents.
  55.         Ele é responsavel por atualizar o layout do
  56.         componente e reposicionar os itens (outros componentes visuais) da displayList.
  57.         */
  58.         override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
  59.         {
  60.             super.updateDisplayList(unscaledWidth, unscaledHeight);
  61.            
  62.             // verifica se o estilo foi alterado.
  63.             if (estiloMudou == true)
  64.             {
  65.                 _faixasLaranjas = getStyle("faixasLaranjas");
  66.                 desenhaFaixasLaranjas(unscaledWidth, unscaledHeight);
  67.             }
  68.         }
  69.        
  70.         private function desenhaFaixasLaranjas(_width:Number, _height:Number):void
  71.         {
  72.             //a propriedade graphics é herdada da classe Sprite.
  73.             //nela os desenhos vetorizados podem acontecer.
  74.             //metodo clear() -> limpa os desenhos atuais.
  75.             graphics.clear();
  76.             //verifica se é para desenhar as faixas ou não.
  77.             if(_faixasLaranjas == true)
  78.             {
  79.                 /* Aqui é o lugar onde desenhamos, no caso, as nossas faixas laranjas.
  80.                 Utilizamos o objeto graphics para fazer isso.
  81.                 Aqui desenhamos um quadrado como exemplo. */
  82.                 graphics.moveTo(10, 10);
  83.                 graphics.lineTo(100, 10);
  84.                 graphics.lineTo(100, 100);
  85.                 graphics.lineTo(10, 100);
  86.                 graphics.lineTo(10, 10);
  87.                 graphics.endFill();
  88.             }
  89.         }
  90.     }
  91. }

A documentação do Flex SDK é criticada por não se aprofundar em algumas partes, possuindo exemplos simples e pouco profundos na maioria das vezes. Claro que com um pouco de peripécia é possí­vel extender os exemplos criando algo mais útil e mais próximo de casos de uso reais. Isto me inspirou a publicar isto.

A criação de estilos customizados é essencial para a produção de novos componentes.

Talvez você tenha pensado: "-ah, basta setar o valor padrão no construtor!". Não. O compilador do Flex primeiramente varre a aplicação procurando as tags e cria padrões de estilo ( ps.StyleSheets Declarations) antes de criar qualquer outra coisa. Uma vez que o componente for instanciado e os setStyle() presentes no construtor forem chamados, todos os estilos predefinidos no arquivo CSS, para este componente serão sobrescritos. Teremos então um componente com estilos imutáveis em tempo de compilação.

Há muitas formas de contornar isto e possibilitar estilos customizados em componentes. A forma mais simples e também citada na documentação é a que está logo acima.

Os Passos:
- Cria-se uma propriedade estática. É necessário ser estática pois estas propriedades, assim como métodos estáticos, são criadas antes das instancias das classes.
- Cria-se um método, também estático que:
-Verifica se existe alguma declaração de CSS já existente.
-Se ainda não existe, uma é criada e definida com os valores padrões.
-Define-se o nome da Declaração de folha de estilo com o mesmo nome da Classe.

Enfim, isto é ótitimo pois descarta as metatags INSPECTABLE assim como os setters públicos. Estes, buscando agilidade na produção do código, são comumente usados de uma forma errada para aplicar mudanças no estilo do componente. Desta forma, os dados são recebidos como propriedades e não estilos propriamente ditos, fazendo-os não ficarem editáveis através do CSS.

Edit: Faltou falar sobre a utilização dos nossos estilos no CSS e no MXML.
Sem mais, no CSS, fazemos da seguinte forma:

.novaDeclaracao //desta forma inserimos a propriedade styleName no componente, contendo a string "novaDeclaracao";
{
cornerRadius:10;
borderStyle:solid;
backgroundColor:#eeeeee;
faixasLaranjas:true;
}

...ou...

ClasseExemplo //nome da classe propriamente dito.
{
cornerRadius:10;
borderStyle:solid;
backgroundColor:#eeeeee;
faixasLaranjas:true;
}

Incluí estilos comuns dos componentes padrões do Flex para mostrar a igualdade na utilização. Na primeira forma utilizamos a propriedade styleName:

Actionscript:
  1. <ClasseExemplo styleName="novaDeclaracao"/>

Na segunda forma utilizamos o nome da classe propriamente dita, o que resulta na alteração dos estilos de todas as instancias desta classe. Sem a necessidade de especificar a styleName como no exemplo acima.

O ponto a ser aprendido aqui é o seguinte: Definindo nossos estilos desta maneira, conseguimos utiliza-los exatamente igual outros estilos da maioria dos componentes default do Flex, tais como o cornerRadius, o backgroundColor e o borderStyle.

Por Marcos Arruda em 6/June/2007 | Comentar | Trackback


No Translations

Adicionar comentário

(requerido)
(requerido, não será publicado)