Nível: Intermediário Dan Orlando, Enterprise RIA Consultant, Consultant
14/Jul/2009 Com relação ao desenvolvimento no nível corporativo, o Adobe® Flex SDK passou por melhorias tão significativas que é difícil compreender que ainda é o mesmo produto. Explore novos recursos e funcionalidade para criar
Software as a Service (SaaS) rich Internet application (RIAs) usando o
Flex 4 (beta)
SDK de software livre.
O número de kits de ferramentas e estruturas para desenvolvimento de RIA
e SaaS tem crescido gradualmente nos anos recentes.
Com a compra da Macromedia em 2004, a Adobe Systems herdou o Flex, uma estrutura para construir o que nos referimos como
RIAs. A Adobe decidiu tornar o Flex SDK uma estrutura de software livre, enquanto a ferramenta baseada no Eclipse usada para construir aplicativos Flex permaneceu um produto de software licenciável, que teve, recentemente, a marca alterada de Adobe Flex Builder para Adobe Flash Builder.
Com o aumento rápido em SaaS baseado em nuvem, não é difícil perceber que a estrutura Flex é a ferramenta adotada mais amplamente para desenvolvimento de RIA.
Flex diferencia-se de outros aplicativos, pois o mecanismo no qual é executado
— a Flash Virtual Machine — foi gravado originalmente para gráficos ricos.
Gráficos mais ricos podem ser usados para maximizar o que é conhecido como
design da experiência do usuário, o que torna Flex uma ferramenta lucrativa para criar UIs avançadas.
Como parte da plataforma Flash, Flex é especialmente útil para gerar gráficos acionados por dados impressionantemente suaves e transições avançadas.
Não há como negar que a popularidade do Flex é em grande parte baseada em sua capacidade de criar uma melhor experiência do usuário.
Este artigo verifica de perto os elementos do Flex 4 SDK que podem aprimorar ainda mais sua capacidade em criar UIs de RIA avançadas.
Aparências e Temas
 |
Acrônimos Usados Frequentemente
- API: Interface de programação de aplicativos
- CSS: Cascading Style Sheet
- HTML: Linguagem de Marcação de Hipertexto
- ROI: Retorno sobre investimento
- SDK: Kit de desenvolvimento de software
- UI: Interface com o usuário
- XML: Linguagem de marcação extensível
|
|
O primeiro de três objetivos principais fornecidos à equipe do Flex 4 SDK foi "Design em Mente". Como gerente de produto do Flex SDK, Matthew Chotin explica: "O maior recurso do tema Design em Mente é nossa nova arquitetura de aparência e componente, denominada
Spark. Estendendo a arquitetura Halo existente, Spark fornece um mecanismo muito mais expressivo para que desenvolvedores e designers trabalhem juntos na aparência de seus aplicativos Flex."
Projetar RIAs é mais fácil do que nunca agora como resultado desse objetivo e a atenção da Adobe em criar um ciclo de vida de produto mais unificado significa que a experiência do usuário pode ser melhorada constantemente através do ciclo de vida de desenvolvimento de produto.
De forma simples, o sucesso de SaaS escala de forma exponencial, mesmo com aumentos lineares nos gastos orçamentários de design de experiência do usuário, conforme demonstrado abaixo.
Figura 1. Relacionamento entre Design de Experiência do Usuário e ROI
Spark e SaaS
A biblioteca do Spark é um dos principais proponentes para a iniciativa Design em Mente.
Inclui componentes que gerenciam seus próprios estados internamente.
É possível usar essa funcionalidade estendendo
SkinnableComponent (mostrado na
Lista 1) para controles, em vez de
UIComponent, como o faria ao usar a biblioteca do Halo.
Além disso, é possível usar o objeto
MXMLComponent para estender componentes MXML, o objeto
Group para componentes que simplesmente agrupam uma array de componentes e
SkinnableContainer para — , isso mesmo
— , componentes de contêiner.
Lista 1. Componente SkinnableContainer Declarado em MXML
<?xml version="1.0" encoding="utf-8"?>
<s:SkinnableContainer skinClass="mySkin">
<s:layout>
<s:VerticalLayout horizontalAlign="center"/>
</s:layout>
<s:Rect>
....
</s:Rect>
<s:Button ... />
<s:Button ... />
</s:SkinnableContainer>s
|
Apesar de algumas pessoas alegarem que isso apenas complica as coisas, qualquer pessoa que tiver trabalhado em projetos de nível corporativo estarão profundamente agradecidos por essa grande modificação de design de arquitetura, pois separa e abstrai ainda mais a funcionalidade de tipos específicos de componentes, permitindo customização adicional.
O código da Lista 2 demonstra como o componente
Panel na biblioteca do Spark faz pouco mais do que estender a classe base
SkinnableContainer
. Um ponto a ser observado é que a classe
SkinnableContainer é uma extensão da classe base
Group na biblioteca do Spark, que também pode ser estendida da mesma forma que
UiComponent no Flex 3.
Lista 2. Código do Flex 4 SDK para o Componente Panel do Spark
public class Panel extends SkinnableContainer {
// The content and layout properties are inherited from SkinnableContainer.
// Panel doesn't add much other functionality beyond what's in SkinnableContainer
[SkinPart(required="true")]
/**
* The skin part that defines the appearance of the
* title text in the container.
*/
public var titleField:TextGraphicElement;
/**
* Title or caption displayed in the title bar.
*/
public var title:String;
// This function is called when the skin part is loaded and assigned.
override protected function partAdded(partName:String, instance:*):void
{
// Assign the content to the header and footer. The main content
// assignment is done in the superclass (SkinnableContainer)
super.partAdded(partName, instance);
if (instance == titleField)
{
titleField.text = title;
}
}
}
|
Usando o Formato FXG
 |
Flash Catalyst
O novo Adobe Flash Catalyst beta disponibilizado pela Adobe Labs facilita para um designer criar diferenças visuais e transições entre os estados de um componente.
O designer pode, então, exportar a criação como um arquivo FXG, que pode, então, ser integrado a seu projeto Flex 4.
|
|
O Adobe Flash XML Graphics (FXG) é uma sintaxe declarativa para definir gráficos em aplicativos Flex.
Como a documentação técnica livedocs da Adobe indica,
"FXG é uma linguagem baseada em XML para trocar gráficos entre diferentes aplicativos que suportam o mesmo".
Você controla o poder de FXG usando-o para simplificar o fluxo de trabalho de desenvolvimento de aplicativo.
Por exemplo, um designer pode exportar um documento FXG do
Adobe Photoshop® CS4, Illustrator® CS4,
Fireworks® CS4 ou do Flash Catalyst beta e o código exportado pode ser usado diretamente em um aplicativo Flex 4. FXG é usado comumente em aparências do Spark para desenhar os elementos visuais da classe
skin . É possível usar a sintaxe FXG sequencial ou como componentes customizados.
A amostra de código na Lista 3 demonstra a inclusão de sintaxe FXG na aparência do Spark.
Lista 3. Usando FXG com uma Aparência do Spark
<?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"
height="200" width="200">
<s:layout>
<s:HorizontalLayout/>
</s:layout>
<s:SkinnableContainer id="myContainer" height="200" width="200" >
<s:Button label="Click Me" skinClass="skins.FXGButtonSkin"/>
</s:SkinnableContainer>
</s:Application>
|
O exemplo mostrado na Lista 4 demonstra como é possível usar uma aparência FXG como um componente customizado: esse é o método preferencial de implementação porque o compilador do Flex otimiza o código FXG.
Lista 4. Usando uma Aparência FXG como um Componente Customizado
<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:ai="http://ns.adobe.com/ai/2008"
xmlns:d="http://ns.adobe.com/fxg/2008/dt"
minWidth="21" minHeight="21">
<fx:Metadata>
[HostComponent("spark.components.Button")]
</fx:Metadata>
<s:states>
<s:State name="up"/>
<s:State name="over"/>
<s:State name="down"/>
<s:State name="disabled"/>
</s:states>
<!-- FXG exported from Adobe Illustrator. -->
<s:Graphic version="1.0" viewHeight="30"
viewWidth="100" ai:appVersion="14.0.0.367" d:id="1">
<s:Group x="-0.296875" y="-0.5" d:id="2"
d:type="layer" d:userLabel="Layer 1">
<s:Group d:id="3">
<s:Rect x="0.5" y="0.5" width="100"
height="30" ai:knockout="0">
<s:fill>
<s:LinearGradient x="0.5" y="15.5" scaleX="100" rotation="-0">
<s:GradientEntry color="#ffffff" ratio="0"/>
<s:GradientEntry ratio="1"/>
</s:LinearGradient>
</s:fill>
<s:stroke>
<s:SolidColorStroke color="#0000ff" caps="none"
weight="1" joints="miter" miterLimit="4"/>
</s:stroke>
</s:Rect>
< /s:Group>
</s:Group>
</s:Graphic>
<s:SimpleText id="labelElement horizontalCenter="0"
verticalCenter="1" left="10" right="10"
top="15" bottom="2">
</s:SimpleText>
</s:SparkSkin>
|
Uma terceira maneira de usar FXG é carregando-o como seria feito com componentes.
Lista 5. Carregando FXG da Mesma Maneira que Carregar Componentes
<?xml version="1.0" encoding="utf-8"?>
<s:Graphic
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:Rect id="rect1" width="200" height="200" >
<s:fill>
<s:SolidColor color="0xFFFFCC" />
</s:fill>
<s:stroke>
<s:SolidColorStroke color="0x660099" weight="2" />
</s:stroke>
</s:Rect>
</s:Graphic>
|
O código para o componente FXG é semelhante ao de um componente MXML.
Lista 6. Código para o Componente FXG
<?xml version="1.0"?>
<!-- Set title of the Panel container based on the view state.-->
<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:s="library://ns.adobe.com/flex/spark"
title="Login" title.Register="Register">
<!-- The states property defines the view states.-->
<s:states>
<s:State name="Login"/>
<s:State name="Register"/>
</s:states>
<mx:Form id="loginForm">
<mx:FormItem label="Username:">
<s:TextInput/>
</mx:FormItem>
<mx:FormItem label="Password:">
<s:TextInput/>
</mx:FormItem>
<!-- Add a TextInput control to the form for the Register view state. -->
<mx:FormItem id="confirm" label="Confirm:" includeIn="Register">
<s:TextInput/>
</mx:FormItem>
<mx:FormItem direction="horizontal">
<!-- Use the LinkButton to change to the Register view state.-->
<!-- Exclude the LinkButton from the Register view state.-->
<mx:LinkButton id="registerLink"
includeIn="Login"
label="Need to Register?"
click="currentState='Register'"/>
<!-- Add a LinkButton to the form for the Register view state. -->
<mx:LinkButton label="Return to Login"
includeIn="Register"
click="currentState=''"/>
<mx:Spacer width="100%" id="spacer1"/>
<!-- Set label of the control based on the view state.-->
<s:Button id="loginButton"
label="Login" label.Register="Register" />
</mx:FormItem>
</mx:Form>
</s:Panel>
|
O importante a entender é que FXG faz para MXML o que CSS fez para HTML, mas em uma escala muito maior.
Muitas das limitações impostas no CSS não existem com FXG.
Apesar de parecer estranho comparar FXG a CSS, FXG realiza conceitualmente exatamente a mesma coisa que CSS: separa o código do layout das informações de estilo.
Trabalhando com Estados no Flex 4
Software fornecido como um serviço tenta fazer a ponte entre o software que é executado localmente e o software que é executado remotamente (ou seja, "na nuvem").
Portanto, os requisitos de aplicativos SaaS requerem invariavelmente o desenvolvimento de componentes customizados.
Estados de visualização foram introduzidos com o release da V2.0 do Flex
SDK. Essa inclusão teve uma função significativa na introdução da estrutura do Flex para desenvolvimento de nível corporativo.
A capacidade de desenvolver um aplicativo stateful com diversas UIs e executá-lo a partir de um local remoto através do navegador tornou Flex uma alternativa atraente para as maneiras tradicionais de programação de interfaces da Web stateless.
Um grande problema permaneceu, no entanto: o aplicativo agora era stateful, mas navegar pelos estados de um aplicativo Flex ainda parecia frequentemente mais como navegar pelas páginas de um Web site do que trabalhar com aplicativos executados a partir da unidade local.
O mais importante, uma falta de clareza com relação aos padrões de design "apropriados" para comunicação entre componentes que existem em estados separados de um aplicativo levou a complicações para cumprir prazos finais de projetos em muitos casos.
O resultado foi o desenvolvimento de um estigma parcial em relação a RIA na empresa, que frequentemente referia-se a ele como uma "tecnologia não comprovada".
A equipe do Flex reconheceu essa falha em grande parte baseada em feedback da comunidade, o que enfatiza o valor da tecnologia de software livre.
O resultado é um novo mecanismo de estado no Flex 4 e um grande avanço no campo de desenvolvimento de RIA.
Isso pode parecer como uma declaração ousada, mas os componentes agora são responsáveis por gerenciar seu próprio estado, desacoplando-os ainda mais do aplicativo pai.
O exemplo na Lista 7 demonstra como um pai em qualquer nível do aplicativo pode controlar o estado de seus componentes-filhos.
Lista 7. Controlando o Estado de um Componente-filho
<?xml version="1.0" encoding="utf-8"?>
<s:Application backgroundColor="0xFFFFFF"
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:mx="library://ns.adobe.com/flex/halo"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:comps="comps.*">
<comps:GraphicComp id="graphic1"/>
</s:Application>
|
A Lista 8 mostra o código para declarar o componente.
Lista 8. Declarando o Componente
<?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"
xmlns:MyComp="myComponents.*">
<s:layout>
<s:VerticalLayout/>
</s:layout>
<s:SimpleText text="Login or Register"
fontSize="14" fontWeight="bold"/>
<MyComp:LoginComponent currentState="Login"/>
</s:Application>
|
Animação, Efeitos e 3-D
A biblioteca do Spark também inclui um upgrade significativo para defensores de design de experiência do usuário.
Considerando o tamanho da coleta de novos efeitos, os efeitos do Spark foram divididos em categorias de acordo com a implementação e o tipo de destino para melhor gerenciabilidade, assim como futura escalabilidade.
Essas categorias incluem:
- Efeitos de propriedade
- Efeitos de transformação
- Efeitos de sombreamento de pixel
- Efeitos de filtro
- Efeitos em 3-D
Efeitos de Propriedade
Conforme esperado, os efeitos de propriedade modificam uma ou mais propriedades de um destino.
Isso é feito declarando uma classe Animate para cada propriedade que deveria ser animada.
Todas as declarações de efeitos devem ser feitas dentro de uma tag
<fx:Declarations/>
, que indica ao compilador do Flex que você deseja fazer declarações que não sejam objetos de exibição visíveis, mas comportamentos que podem afetar diretamente ou não um ou mais objetos de exibição visíveis no aplicativo.
Observe que se você usar a classe
<s:Animate/> , deve incluir uma instância da classe
SimpleMotionPath
em cada tag <Animate> .
Essa categoria também inclui os efeitos do tipo
Fade, Resize e
AnimateColor.
Efeitos de Transformação
A principal característica de um efeito de transformação que separa-o de efeitos de propriedade é que força efeitos paralelos a trabalharem bem juntos, para que não precise mais encontrar uma solução alternativa se seus efeitos estiverem em conflito uns com os outros, causando um comportamento aleatório (como era o caso com o Flex 3).
Essa categoria faz com que diversos efeitos operem em paralelo nas mesmas propriedades ou em propriedades relacionadas de um objeto de exibição específico para serem mescladas, resultando em uma "transformação" mais realista do objeto.
Com alguma criatividade, é possível criar maneiras exclusivas para implementar os efeitos nessa categoria e criar transições que tenham um efeito na experiência do usuário, diferentemente de qualquer outro aplicativo Flex.
A Lista 9 fornece um exemplo de um efeito de transformação.
Lista 9. Exemplo do Efeito de Transformação
<?xml version="1.0"?>
<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:Declarations>
<s:Parallel id="parallelRMForward"
target="{myImage}">
<s:Rotate
angleBy="180"/>
<s:Move
xBy="100"
yBy="100"/>
</s:Parallel>
<s:Parallel id="parallelRMBack"
target="{myImage}">
<s:Rotate
angleBy="180"/>
<s:Move
xBy="-100"
yBy="-100"/>
</s:Parallel>
</fx:Declarations>
<s:Button label="Play Effect Forward"
x="10" y="10"
click="parallelRMForward.end();parallelRMForward.play();"/>
<s:Button label="Play Effect Backward"
x="150" y="10"
click="parallelRMBack.end();parallelRMBack.play();" />
<mx:Image id="myImage"
x="10" y="50"
source="@Embed(source='assets/logo.jpg')"/>
</s:Application>
|
Efeitos de Sombreamento de Pixel
Os efeitos de sombreamento de pixel integrados do Spark, CrossFade e Wipe, usam seus próprios sombreamentos de pixel internos.
Esse tipo de efeito funciona capturando um bitmap "antes" e um "depois", depois juntando os dois até o "depois" ser o único visível.
A coisa realmente interessante sobre os efeitos de sombreamento de pixel é que é possível usar a ferramenta Adobes Pixel Bender para criar efeitos de sombreamento de pixel customizados e usá-los em seu aplicativo Flex.
A Lista 10 demonstra o uso do efeito Wipe integrado.
Lista 10. Efeito Wipe
<?xml version="1.0"?>
<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:layout>
<s:VerticalLayout/>
</s:layout>
<!-- Define two view states.-->
<s:states>
<s:State name="default"/>
<s:State name="red"/>
</s:states>
<!-- Define the transition that applies the Wipe effect
whenever the view state changes.-->
<s:transitions>
<s:Transition fromState="*" toState="*">
<s:Sequence target="{myB}">
<s:Wipe id="wipeEffect"
direction="right"
duration="1000"/>
</s:Sequence>
</s:Transition>
</s:transitions>
<s:Button id="myB" label="Wipe"
color="black" color.red="red"/>
<!-- Define two buttons to change the view state. -->
<s:Button label="Set Default State"
click="currentState='default'"/>
<s:Button label="Set Red State"
click="currentState='red'"/>
</s:Application>
|
Efeitos de Filtro
A principal característica diferencial dos efeitos de filtro é que a propriedade animada é uma de um objeto
Filter , em vez de animar uma propriedade do objeto de exibição.
Você anima as propriedades de um filtro usando a classe
AnimateFilter
. Após declarar AnimateFilter, o objeto de exibição de destino, a contagem de repetição, a duração e o filtro exato no qual ser operado podem ser declarados.
O exemplo na Lista 11 demonstra como criar um
DropShadowFilter animado.
Lista 11. DropShadowFilter
animado.
<fx:Declarations>
<s:DropShadowFilter id="myDSF"
color="0x0000FF"
distance="5"
angle="315"/>
<s:AnimateFilter id="myFilter"
target="{myB2}"
repeatCount="0"
duration="500"
repeatBehavior="reverse"
bitmapFilter="{new spark.filters.DropShadowFilter()}">
<s:SimpleMotionPath property="color" valueFrom="0" valueTo="0x0000FF"/>
<s:SimpleMotionPath property="distance" valueFrom="0" valueTo="10"/>
<s:SimpleMotionPath property="angle" valueFrom="270" valueTo="360"/>
</s:AnimateFilter>
</fx:Declarations>
|
Efeitos em 3-D
Falando de forma comparativa, os efeitos em 3-D do Spark dificilmente são comparados ao que é possível com bibliotecas do 3-D Adobe ActionScript dedicadas de software livre, como Papervision3D, Away3D e Sandy3D. Ao mesmo tempo, os efeitos em 3-D nativos incluídos são um bom ponto de partida e mostram que a Adobe tem um interesse genuíno em 3-D com a Plataforma Flash.
Os efeitos em 3-D do Spark incluem Move3D, Rotate3D e Scale3D. Cada um dos efeitos em 3-D podem ser implementados conforme mostrado na Lista 12, que usa o efeito
Rotate3D.
Lista 12. Usando Efeitos em 3-D Nativos
<?xml version="1.0" encoding="utf-8"?>
<s:Application name="Rotate3D Tester"
xmlns="http://ns.adobe.com/mxml/2009">
<layout>
<BasicLayout />
</layout>
<fx:Declarations>
<s:Rotate3D id="x_rotate3d"
target="{image}"
xFrom="0"
xTo="360"
duration="2000" />
<s:Rotate3D id="y_rotate3d"
target="{image}"
yFrom="0"
yTo="360"
duration="2000" />
<s:Rotate3D id="z_rotate3d"
target="{image}"
zFrom="0"
zTo="360"
duration="2000" />
</fx:Declarations>
<s:VGroup id="vGroup" left="10" top="10">
<s:Button id="btnX"
label="Rotate3D X-axis"
click="x_rotate3d.play();" />
<s:Button id="btnY"
label="Rotate3D Y-axis"
click="y_rotate3d.play();" />
<s:Button id="btnZ"
label="Rotate3D Z-axis"
click="z_rotate3d.play();" />
</s:VGroup>
<mx:Image id="image"
source="@Embed('assets/image.jpg')"
horizontalCenter="0"
verticalCenter="0"
width="100"
height="100" />
</s:Application>
|
Novo Mecanismo de Texto
O Adobe Flash Player 10 trouxe com ele um novo mecanismo de texto para fornecer suporte adicional para aprimoramentos que incluem recursos de diversos idiomas e impressão.
A estrutura Flex 4 inclui um novo conjunto de classes para texto, como
RichText e
SimpleText. A maior melhoria virá quando a integração do Text Layout Framework da Adobe Labs for concluída, que é esperada algum tempo antes de a estrutura estar em release público integral e fora do beta (consulte Recursos para obter informações adicionais). O Text Layout Framework tem a intenção de fornecer a capacidade de usar o mecanismo de texto integrado ao
Flash Player 10.
 | |
Uma enorme melhoria que faz com que SaaS pareça mais um aplicativo de desktop local são os movimentos de teclado padrão e mouse para editar texto, inclusive recortar, copiar, colar e desfazer.
Também são incluídos controles tipográficos ricos, incluindo ajuste correto de espaçamento (kerning), ligaduras, letras tipográficas e suporte a mais de 30 sistemas de composição com diversos idiomas.
O mais importante. o mecanismo de texto inclui APIs de desenvolvedor ricas para manipular conteúdo do texto, layout e marcação e criar componentes de texto customizados.
As três primitivas de texto principais no novo mecanismo de texto são
SimpleText,
RichText e
RichEditableText.
O suporte básico à marcação HTML, gráficos sequenciais, contêineres vinculados e hyperlinks integrados são alguns dos novos recursos mais interessantes para renderização de texto no Flex 4 SDK. Os componentes TextInput e
TextArea padrão do Spark usam
RichEditableText para fornecer a área de texto editável, portanto, esses componentes comuns agora podem fazer mais do que antes.
A Lista 13 fornece um exemplo simples do que é possível com o componente
RichText .
Lista 13. Usando os Novos Recursos do Componente
RichText do Spark
<s:RichText fontSize="12">
<s:content>
<s:TextFlow color="0x222222">
<s:p>
<s:span fontWeight="bold">Hello </span>
<s:spanv World</s:span>
</s:p>
</s:TextFlow>
</s:content>
</s:RichText>
|
Conclusão
Deve estar razoavelmente claro agora que o sucesso de SaaS está muito relacionado ao design de experiência do usuário.
Além do mais, agora que você percorreu muitos dos novos recursos do Flex 4 SDK centralizados no aprimoramento da experiência do usuário, melhorou efetivamente seu conjunto de qualificações, aprendendo como criar aplicativos SaaS mais avançados.
RIA e SaaS são praticamente idênticos e ambos são identificados como a nova geração de interação humana/computacional.
Especialistas acreditam que o segmento de mercado continuará nessa direção, e certamente irá.
Com isso em mente, incentivo-o a continuar desenvolvendo seu conjunto de qualificações de desenvolvimento de RIA.
Recursos Aprender
Obter produtos e tecnologias
Discutir
Sobre o autor  | 
|  | Dan Orlando é um arquiteto e consultor reconhecido da Plataforma Flash na empresa.
Como um defensor do RIA, Dan já foi publicado em revistas e Web sites, como PHP Architect, Flash and Flex Developer Magazine, IBM developerWorks, Amazon Web Services e Adobe Developer Connection. Dan também é coautor de Flex 4 in Action (Manning Press). |
Avalie esta página
|