Fx4 III: FXG 1.0
En esta cuarta versión de Flex se han producido cambios considerables en la arquitectura de componentes así como en el lenguaje MXML. Esto se ha hecho para potenciar varios aspectos como son la productividad, facilitar el workflow designer / developer o la integración con herramientas externas.
En esta entrada se verá qué es FXG dentro del contexto Flex 4. FXG es la especificación del nuevo formato de intercambio de gráficos para el Flash Player.
Introducción
FXG (Flash XML Graphics) es un lenguaje basado en XML que expone toda la capacidad de renderizado del Flash Player de forma declarativa. La especificación de FXG se ha creado para ofrecer un formato de intercambio de gráficos entre aplicaciones de edición gráfica y el Flash Player que sea fácil de utilizar y a la vez ofrezca un control total del resultado final y de la optimización del mismo.
En la especificación de FXG encontramos un conjunto de elementos gráficos, texto, filtros, etc.. con los cuales se puede crear, agrupar, transformar y modificar formas vectoriales, bitmaps y texto.
Documentos FXG
En una aplicación Flex podemos utilizar FXG en línea dentro de un documento *.MXML de la misma forma que utilizamos otros componentes Flex o bien auto contenido como componente en un archivo *.FXG o *.MXML externo.
Aunque en ambos casos podamos obtener el mismo resultado internamente las cosas son ciertamente diferentes. En el caso de utilizar FXG en línea dentro de un archivo MXML lo que estamos haciendo es utilizar la implementación de FXG que el SDK de Flex nos proporciona, es decir, obtenemos instancias de clases que están dentro de la cadena de herencia del SDK de Flex.
En el caso de utilizar un FXG como componente desde un archivo externo lo que obtenemos en el momento de compilación es un recurso gráfico muy optimizado en cuanto a uso de memoria y que hereda de spark.core.SpriteVisualElement, una clase de mucho más bajo nivel y por lo tanto mucho más ligera.
¿FXG o Flex FXG?
Entonces, ¿cuándo utilizar una u otra opción? Si necesitamos elementos gráficos que soporten el ciclo de vida del sdk de Flex y que nos proporcionen toda la interactividad del framework (eventos, data binding, etc...) entonces debemos utilizar la implementación de FXG que nos proporciona Flex a través de Spark, de lo contrario lo mejor es externalizar en forma de componente FXG para sacar partido de las optimizaciones que el compilador nos brinda.
Debemos tener en cuenta que dentro de un comonente FXG no se pueden utilizar las funcionalidades del SDK, tampoco tipos nativos del Flash Player o en definitiva lógica alguna. El componente es puramente un descriptor de un elemento gráfico.
Implementación FXG en Flex
Flex contiene una implementación FXG completa en el espacio de nombres Spark. En esta entrada vamos a aprender a utilizar FXG a través de dicha implementación.
A continuación vamos a revisar los distintos elementos FXG de los que disponemos en Flex.
Formas
Las formas vectoriales se componen de los puntos que la definen, un relleno y un trazo.
fill
El relleno de cualquer forma se declara mediante la propiedad fill.
Esta propiedad acepta implementaciones de IFill:
- mx.graphics.BitmapFill
- mx.graphics.LinearGradient
- mx.graphics.RadialGradient
- mx.graphics.SolidColor
stroke
El trazo que define una forma se declara mediante la propiedad stroke.
Esta propiedad acepta implementaciones de IStroke:
- mx.graphics.LinearGradientStroke
- mx.graphics.RadialGradientStroke
- mx.graphics.SolidColorStroke
spark.primitives.Rect
spark.primitives.Ellipse
spark.primitives.Line
Estas primitivas declaran respectivamente una forma rectangular, una elipse y una línea.
Un ejemplo de uso:
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application
-
xmlns:fx="http://ns.adobe.com/mxml/2009"
-
xmlns:s="library://ns.adobe.com/flex/spark"
-
xmlns:mx="library://ns.adobe.com/flex/halo">
-
-
<s:Rect width="150" height="100" x="100" y="100">
-
<s:stroke>
-
<mx:SolidColorStroke color="#FF0000" weight="5"/>
-
</s:stroke>
-
<s:fill>
-
<mx:SolidColor color="#000000"/>
-
</s:fill>
-
</s:Rect>
-
-
<s:Ellipse width="100" height="150" x="50" y="50">
-
<s:fill>
-
<mx:RadialGradient>
-
<mx:GradientEntry color="#FF0000" alpha="0.5"/>
-
<mx:GradientEntry color="#00FF00" alpha="1"/>
-
</mx:RadialGradient>
-
</s:fill>
-
</s:Ellipse>
-
-
<s:Line xFrom="100" xTo="250" yFrom="100" yTo="250">
-
<s:stroke>
-
<mx:SolidColorStroke color="#0000FF" weight="10"/>
-
</s:stroke>
-
</s:Line>
-
-
</s:Application>

spark.primitives.Path
Esta primitiva permite declarar libremente cualquier forma.
Con Path podemos definir una secuencia de segmentos rectos o circulares para que conformen el perímetro de una forma. Dichos segmentos se asignan desde el atributo segments:Array y pueden ser de los siguientes tipos:
- spark.primitives.pathSegments.LineSegment
- spark.primitives.pathSegments.CubicBezierSegment
- spark.primitives.pathSegments.QuadraticBezierSegment
Adicionalmente disponemos de la clase spark.primitives.pathSegments.MoveSegment para mover el punto desde el que se empieza a dibujar.
Además de poder definir declarativamente la secuencia de segmentos disponemos del atributo data, el cual nos permite pasar un String con notación SVG para que defina dicha secuencia de segmentos.
Con toda esta versatilidad, la clase Path nos permite obtener el mismo resultado que con las primitivas que se muestran anteriormente y más
Un ejemplo de uso:
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application
-
xmlns:fx="http://ns.adobe.com/mxml/2009"
-
xmlns:mx="library://ns.adobe.com/flex/halo"
-
xmlns:s="library://ns.adobe.com/flex/spark">
-
-
<s:Path>
-
<s:segments>
-
<s:MoveSegment x="100" y="100"/>
-
<s:LineSegment x="200" y="100"/>
-
<s:LineSegment x="200" y="200"/>
-
<s:LineSegment x="100" y="200"/>
-
<s:CubicBezierSegment control1X="50" control1Y="175" control2X="50" control2Y="125" x="100" y="100"/>
-
</s:segments>
-
<s:stroke>
-
<s:Stroke color="0x888888"/>
-
</s:stroke>
-
</s:Path>
-
-
<s:Path>
-
<s:data>
-
M 50 50
-
L 150 50
-
L 150 150
-
L 50 150
-
C 0 125 0 75 50 50
-
</s:data>
-
<s:stroke>
-
<s:Stroke color="0xFF0000" weight="10"/>
-
</s:stroke>
-
</s:Path>
-
-
</s:Application>

spark.primitives.BitmapImage
Esta primitiva nos permite cargar un bitmap en una superficie rectangular. El bitmap puede ocupar una porción, la totalidad o incluso más de la superficie disponible. Adicionalmente se puede controlar si el bitmap se escala o no y si se repite a lo largo de la superficie.
Un ejemplo:
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application
-
xmlns:fx="http://ns.adobe.com/mxml/2009"
-
xmlns:mx="library://ns.adobe.com/flex/halo"
-
xmlns:s="library://ns.adobe.com/flex/spark">
-
-
<s:Graphic x="10" y="10">
-
<s:BitmapImage source="@Embed('/mif_logo.png')"/>
-
</s:Graphic>
-
-
<s:Graphic x="10" y="101">
-
<s:BitmapImage source="@Embed('/mif_logo.png')" width="600" height="100" resizeMode="scale" alpha="0.8"/>
-
</s:Graphic>
-
-
<s:Graphic x="10" y="211">
-
<s:BitmapImage source="@Embed('/mif_logo.png')" width="432" height="162" repeat="true" alpha="0.5"/>
-
</s:Graphic>
-
-
</s:Application>

Texto
FXG proporciona dos primitivas para tratar zonas de contenido textual:
- spark.primitives.RichText
- spark.primitives.SimpleText
RichText es para definir texto rico, en el cuál se pueden renderizar distintos tipos de formatos a la vez, distintos tipos de elementos como imágenes, texto, etc...
Esta clase saca partido del FTE (Flash Text Engine) a través del TLF (Text Layout Framework). El FTE es un conjunto de componentes de bajo nivel existentes en el Flash Player 10 que, a través de sus APIs ActionScript permiten crear por encima implementaciones listas para ser utilizadas como campos de texto, como el TLF.
A través de la propiedad content de RichText se pueden intercalar elementos de texto mezclados con distintos tags que permiten desde asignar formatos a grupos de caracteres hasta intercalar imágenes entre otros grupos de caracteres, etc..
Estos son los tags soportados:
- div
- p
- span
- a
- img
- br
- tab
- tcy
Cada uno de ellos sopora un conjunto de atributos y permite realizar una serie de operaciones determinadas. Toda esta potencia es, sin duda, un paso de gigante en lo que a renderizado de bloques de texto se refiere.
SimpleText soporta un solo formato que se aplica a todo el texto. Esta clase ofrece una funcionalidad parecida a la clase mx:Label de la versión 3 de Flex pero con soporte multiline.
Un ejemplo:
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application
-
xmlns:fx="http://ns.adobe.com/mxml/2009"
-
xmlns:mx="library://ns.adobe.com/flex/halo"
-
xmlns:s="library://ns.adobe.com/flex/spark">
-
-
<s:RichText x="100" y="100" fontFamily="Arial" fontSize="16" width="200">
-
<s:content>
-
Lorem <s:span fontWeight="bold" color="#FF0000">Ipsum</s:span> dolor sit amet,
-
<s:img source="@Embed('/comment.png')" width="16" height="16"/> consectetur
-
adipiscing elit. Aliquam <s:img source="@Embed('/search.png')" width="16" height="16"/>
-
sodales magna vel nisl fermentum vel gravida orci bibendum.<s:br /> Quisque accumsan
-
ultrices lacus id <s:span fontStyle="italic">sollicitudin</s:span>. Vivamus fermentum
-
tortor a odiodapibus <s:img source="@Embed('/warning.png')" width="16" height="16"/>
-
id posuere augue congue. Morbi ultricies felis a elit adipiscing dignissim.
-
</s:content>
-
</s:RichText>
-
-
<s:SimpleText x="350" y="100" width="200" fontSize="12" fontFamily="Verdana">
-
<s:text><![CDATA[Lorem ipsum dolor sit amet, "consectetur" adipiscing elit.<br/>Aliquam sodales magna vel nisl fermentum vel gravida orci bibendum.<br/>Quisque accumsan ultrices lacus idsollicitudin.]]></s:text>
-
</s:SimpleText>
-
-
</s:Application>

spark.components.Group
La clase Group permite agrupar elementos en un lienzo con origen de coordenadas propio. Por defecto utiliza layout de posicionamiento absoluto que puede cambiarse en tiempo de ejecución por cualquier otro tipo de layout, ya sea uno de los disponibles en Spark o uno personalizado por nosotros mismos.
Se dispone de las subclases VGroup y HGroup para trabajar con layout vertical y horizontal respectivamente.
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application
-
xmlns:fx="http://ns.adobe.com/mxml/2009"
-
xmlns:mx="library://ns.adobe.com/flex/halo"
-
xmlns:s="library://ns.adobe.com/flex/spark">
-
-
<s:Group x="100" y="100" width="100" height="100">
-
<s:Rect width="100%" height="100%">
-
<s:stroke>
-
<mx:SolidColorStroke color="#FF0000" weight="5"/>
-
</s:stroke>
-
<s:fill>
-
<mx:SolidColor color="#00FF00"/>
-
</s:fill>
-
</s:Rect>
-
</s:Group>
-
-
<s:Group x="150" y="150">
-
<s:Rect width="150" height="150">
-
<s:stroke>
-
<mx:SolidColorStroke color="#000000" weight="5"/>
-
</s:stroke>
-
<s:fill>
-
<mx:SolidColor color="#0000FF"/>
-
</s:fill>
-
</s:Rect>
-
</s:Group>
-
-
</s:Application>

Library
El concepto de librería y símbolo no es nada nuevo dentro del mundo Flash, de hecho has sido un pilar para la evolución de la tecnología y para ayudar a introducir los coneptos de de clase e instancia de POO a todos los usuarios no programadores de Flash.
Flex 4 se sirve nuevamente de esta metáfora a través del tag Library que proporciona el espacio de nombres de lenguaje MXML2009.
En este nodo MXML podemos anidar dentro de un tag Definition cualquier grupo o elemento gráfico a modo de template para ser usado (instanciado) en cualquier lugar del documento tantas veces como se quiera. Es importante notar que los elementos que añadimos en Library quedan accesibles exclusivamente dentro del ámbito del documento MXML que los declara.
Para crear las instancias de cada una de las definiciones utilizaremos el atributo name del Definition que deseemos para referenciar el template de objeto.
-
<?xml version="1.0" encoding="utf-8"?>
-
<s:Application
-
xmlns:fx="http://ns.adobe.com/mxml/2009"
-
xmlns:mx="library://ns.adobe.com/flex/halo"
-
xmlns:s="library://ns.adobe.com/flex/spark">
-
-
<fx:Library>
-
<fx:Definition name="grupo">
-
<s:Group>
-
<s:Rect width="150" height="150">
-
<s:stroke>
-
<mx:SolidColorStroke color="#FF0000" weight="5"/>
-
</s:stroke>
-
<s:fill>
-
<mx:SolidColor color="#00FF00"/>
-
</s:fill>
-
</s:Rect>
-
<s:Ellipse width="150" height="150">
-
<s:stroke>
-
<mx:SolidColorStroke color="#000000" weight="5"/>
-
</s:stroke>
-
</s:Ellipse>
-
</s:Group>
-
</fx:Definition>
-
</fx:Library>
-
-
<fx:grupo x="100" y="100"/>
-
<fx:grupo x="150" y="150" alpha="0.5"/>
-
-
</s:Application>

Conclusión
FXG es una especificación muy potente que ofrece a la plataforma Flash una herramienta a medida para intercambiar gráficos entre distintas aplicaciones. Además, a través de la implementación que Flex 4 lleva en el espacio de nom bres Spark, proporciona una versatilidad nunca vista antes ( bueno si.. ver Degrafa
) a la hora de declarar interfaces.
Gracias a FXG el workflow designer/developer nunca más va a ser un obstáculo para llevar la tecnología a los más altos niveles de perfección gráfica.
Acerca de esta entrada
Usted está leyendo “Fx4 III: FXG 1.0,” una entrada de MadeInFlex
- Autor: Joan Garnet
Joan es desarrollador de aplicaciones web especializado en la Plataforma Flash y su integración con otras tecnologías. Actualmente trabaja desarrollando software en Undefined, empresa de la que es socio.
- URL del Autor:
- http://www.joangarnet.com/
- Publicada:
- 18.07.09 / 5pm
- Categorías:
- Artículos, Flex 4, Tutoriales
- Entradas relacionadas:
- No related posts
- Número de visitas:
- 5394
5 Comentarios
Ir al formulario de comentarios | rss (comentarios) [?] | trackback url [?]