Flex/ Flex 4.5

Flex 4.5 TextArea auto-scroll e desabilitar scrolls

O TextArea é um componente incrível, além de suportar textos simples (String) ele também suporta o Text Layout Framework, e com essa nova arquitetura Spark a coisa ficou tão fácil que até parece brincadeira de criança.

Recemente alguns e-mails chegaram em minha caixa de entrada com várias perguntas a respeito do auto-scroll do TextArea, uma coisa bastante comum no Flex 3 TextArea é que você tem que programaticamente dar o scroll para baixo via actionscript, já no Flex 4.5 você vai perceber que isso é automático e então você não precisa debulhar o componente e criar um novo apenas para isso.

Por um lado ele traz essa praticidade, por outro ele traz um desavento devido a nova API e métodos distintos, por exemplo, Se você quiser manter o scroll mesmo texto crescendo no topo, você tem que usar o método scrollToRange, que faz o metodo inverso do comportamento natural do Flex 4.5 TextArea.

Por exemplo scroll inverso:

<?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/mx" minWidth="955" minHeight="600">
	<fx:Script>
		<![CDATA[
			import spark.events.TextOperationEvent;
 
			protected function meuTexto_changeHandler(event:TextOperationEvent):void
			{
				meuTexto.textDisplay.scrollToRange(0,0);
			}
 
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<s:TextArea id="meuTexto" x="72" y="81" minWidth="361" minHeight="276" prompt="Cole algum texto aqui" change="meuTexto_changeHandler(event)"/>
</s:Application>

O scrollToRange é acessível apenas pela propriedade textDisplay que é detentora dos textos(simples, não confunda com textFlow) atribuídos ao TextArea. Com essa propriedade você consegue expor mais opções para seu componente como é o caso da propriedade pública maxChars diretamente acessível pelo TextArea.

Abra o código fonte e você vai ver que ele primeiro seta via textDisplay.

 public function set maxChars(value:int):void
    {
        if (textDisplay)
        {
            textDisplay.maxChars = value; // aqui você seta.
            textDisplayProperties = BitFlagUtil.update(
                uint(textDisplayProperties), MAX_CHARS_PROPERTY_FLAG, true);
        }
        else
        {
            textDisplayProperties.maxChars = value;
        }
 
        // Generate an UPDATE_COMPLETE event.
        invalidateProperties();
    }

E com a brincadeira de Skins, você pode fazer muito mais, por exemplo veja esse Skin que criei para meu TextArea.

<?xml version="1.0" encoding="utf-8"?>
 
<!--
 
    ADOBE SYSTEMS INCORPORATED
    Copyright 2008 Adobe Systems Incorporated
    All Rights Reserved.
 
    NOTICE: Adobe permits you to use, modify, and distribute this file
    in accordance with the terms of the license agreement accompanying it.
 
-->
 
<!--- The default skin class for Spark TextArea component.
 
     @see spark.components.TextArea
 
      @langversion 3.0
      @playerversion Flash 10
      @playerversion AIR 1.5
      @productversion Flex 4
-->
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
    alpha.disabledStates="0.5" blendMode="normal">
 
    <fx:Metadata>
    <![CDATA[
        /**
         * @copy spark.skins.spark.ApplicationSkin#hostComponent
         */
        [HostComponent("spark.components.TextArea")]
    ]]>
    </fx:Metadata>
 
    <fx:Script fb:purpose="styling">
        <![CDATA[
        import mx.core.FlexVersion;
 
        private var lineBreakChanged:Boolean;
        private var paddingChanged:Boolean;
        private var verticalAlignChanged:Boolean;
 
        /* Define the skin elements that should not be colorized.
           For text area, the skin itself is colorized but the individual parts are not as well
           as the border since it uses the borderColor style. */
        static private const exclusions:Array = ["background", "scroller", "promptDisplay", "border"];
 
        /* exclusions before Flex 4.5 for backwards-compatibility purposes */
        static private const exclusions_4_0:Array = ["background", "scroller", "promptDisplay"];
 
        /**
         * @private
         */
        override public function get colorizeExclusions():Array
        {
            // Since border is styleable via borderColor, no need to allow chromeColor to affect
            // the border.  This is wrapped in a compatibility flag since this change was added
            // in Flex 4.5
            if (FlexVersion.compatibilityVersion < FlexVersion.VERSION_4_5)
            {
                return exclusions_4_0;
            }
 
            return exclusions;
        }
 
        /* Define the content fill items that should be colored by the "contentBackgroundColor" style. */
        static private const contentFill:Array = ["bgFill"];
 
        /**
         *  @private
         */
        override public function get contentItems():Array {return contentFill};
 
        /**
         *  @private
         */
        override protected function commitProperties():void
        {
            super.commitProperties();
 
            if (lineBreakChanged)
            {
                updateStringStyle("lineBreak");
                lineBreakChanged = false;
            }
            if (paddingChanged)
            {
                updatePadding();
                paddingChanged = false;
            }
            if (verticalAlignChanged)
            {
                updateStringStyle("verticalAlign");
                verticalAlignChanged = false;
            }
        }
 
        /**
         * @private
         */
        override protected function initializationComplete():void
        {
            useChromeColor = true;
            super.initializationComplete();
        }
 
        /**
         *  @private
         */
        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            if (getStyle("borderVisible") == true)
            {
                border.visible = true;
                shadow.visible = true;
                background.left = background.top = background.right = background.bottom = 1;
                textDisplay.left = textDisplay.top = textDisplay.right = textDisplay.bottom = 1;
                if (promptDisplay)
                {
                    promptDisplay.setLayoutBoundsSize(unscaledWidth - 2, unscaledHeight - 2);
                    promptDisplay.setLayoutBoundsPosition(1, 1);
                }
            }
            else
            {
                border.visible = false;
                shadow.visible = false;
                background.left = background.top = background.right = background.bottom = 0;
                if (promptDisplay)
                {
                    promptDisplay.setLayoutBoundsSize(unscaledWidth - 1, unscaledHeight - 1);
                    promptDisplay.setLayoutBoundsPosition(1, 1);
                }
            }
 
            borderStroke.color = getStyle("borderColor");
            borderStroke.alpha = getStyle("borderAlpha");
 
            super.updateDisplayList(unscaledWidth, unscaledHeight);
        }
 
        /**
         *  @private
         */
        private function updatePadding():void
        {
            if (!textDisplay)
                return;
 
            // Push padding styles into the textDisplay
            var padding:Number;
 
            padding = getStyle("paddingLeft");
            if (textDisplay.getStyle("paddingLeft") != padding)
                textDisplay.setStyle("paddingLeft", padding);
 
            padding = getStyle("paddingTop");
            if (textDisplay.getStyle("paddingTop") != padding)
                textDisplay.setStyle("paddingTop", padding);
 
            padding = getStyle("paddingRight");
            if (textDisplay.getStyle("paddingRight") != padding)
                textDisplay.setStyle("paddingRight", padding);
 
            padding = getStyle("paddingBottom");
            if (textDisplay.getStyle("paddingBottom") != padding)
                textDisplay.setStyle("paddingBottom", padding);
 
            if (!promptDisplay)
                return;
 
            padding = getStyle("paddingLeft");
            if (promptDisplay.getStyle("paddingLeft") != padding)
                promptDisplay.setStyle("paddingLeft", padding);
 
            padding = getStyle("paddingTop");
            if (promptDisplay.getStyle("paddingTop") != padding)
                promptDisplay.setStyle("paddingTop", padding);
 
            padding = getStyle("paddingRight");
            if (promptDisplay.getStyle("paddingRight") != padding)
                promptDisplay.setStyle("paddingRight", padding);
 
            padding = getStyle("paddingBottom");
            if (promptDisplay.getStyle("paddingBottom") != padding)
                promptDisplay.setStyle("paddingBottom", padding);
        }
 
        /**
         *  @private
         */
        private function updateStringStyle(styleName:String):void
        {
            if (!textDisplay)
                return;
 
            // Push style into the textDisplay
            var style:String;
 
            style = getStyle(styleName);
            if (textDisplay.getStyle(styleName) != style)
                textDisplay.setStyle(styleName, style);
 
            if (!promptDisplay)
                return;
 
            // Push style into the promptDisplay
            style = getStyle(styleName);
            if (promptDisplay.getStyle(styleName) != style)
                promptDisplay.setStyle(styleName, style);
        }
 
        /**
         *  @private
         */
        override public function styleChanged(styleProp:String):void
        {
            var allStyles:Boolean = !styleProp || styleProp == "styleName";
 
            super.styleChanged(styleProp);
 
            if (allStyles || styleProp.indexOf("lineBreak") == 0)
            {
                lineBreakChanged = true;
                invalidateProperties();
            }
            if (allStyles || styleProp.indexOf("padding") == 0)
            {
                paddingChanged = true;
                invalidateProperties();
            }
            if (allStyles || styleProp.indexOf("verticalAlign") == 0)
            {
                verticalAlignChanged = true;
                invalidateProperties();
            }
        }
 
			protected function changeSelectHandler(event:Event):void
			{
				// TODO Auto-generated method stub
				if(allText.selected)
					textDisplay.selectAll();
				else
					textDisplay.selectRange(textDisplay.text.length,textDisplay.text.length);
 
			}
 
		]]>
    </fx:Script>
 
    <fx:Script>
        <![CDATA[
        /**
         * @private
         */
        private static const focusExclusions:Array = ["textDisplay"];
 
        /**
         *  @private
         */
        override public function get focusSkinExclusions():Array { return focusExclusions;};
        ]]>
    </fx:Script>
 
    <s:states>
        <s:State name="normal"/>
        <s:State name="disabled" stateGroups="disabledStates"/>
        <s:State name="normalWithPrompt"/>
        <s:State name="disabledWithPrompt" stateGroups="disabledStates"/>
    </s:states>
 
 
    <!-- border -->
    <!--- @private -->
    <s:Rect id="border" left="0" right="0" top="0" bottom="0">
        <s:stroke>
            <!--- @private -->
            <s:SolidColorStroke id="borderStroke" weight="1"/>
        </s:stroke>
    </s:Rect>
 
    <!-- fill -->
    <!--- Defines the appearance of the TextArea component's background. -->
    <s:Rect id="background" left="1" right="1" top="1" bottom="1">
        <s:fill>
            <!--- @private Defines the background fill color. -->
            <s:SolidColor id="bgFill" color="0xFFFFFF" />
        </s:fill>
    </s:Rect>
 
    <!-- shadow -->
    <!--- @private -->
    <s:Rect id="shadow" left="1" top="1" right="1" height="1">
        <s:fill>
            <s:SolidColor color="0x000000" alpha="0.12" />
        </s:fill>
    </s:Rect>
 
    <!--- Defines the scroller that is used to scroll the TextArea control. -->
    <s:Scroller id="scroller" left="0" top="20" right="0" bottom="0" minViewportInset="1" measuredSizeIncludesScrollBars="false" hasFocusableChildren="false">
        <!--- @copy spark.components.supportClasses.SkinnableTextBase#textDisplay -->
        <s:RichEditableText id="textDisplay" heightInLines="10" widthInChars="15" />
    </s:Scroller>
 
    <!--- Defines the Label that is used for prompt text. The includeInLayout property is false so the prompt text does not affect measurement. -->
    <s:Label id="promptDisplay"
                mouseEnabled="false" mouseChildren="false"
                includeIn="normalWithPrompt,disabledWithPrompt"
                includeInLayout="false"
                />
	<!-- grupo header -->
	<s:Rect left="0" right="0" top="0" height="20">
		<s:fill>
			<s:SolidColor color="#f4f4f4"/>
		</s:fill>
	</s:Rect>
	<s:Group left="0" right="0" top="0">
		<s:layout>
			<s:HorizontalLayout verticalAlign="middle"/>
		</s:layout>
		<s:Label text="Posição atual da seleção: {textDisplay.selectionActivePosition}"/>
		<s:CheckBox includeIn="normal" id="allText" label="Selecionar tudo" change="changeSelectHandler(event)"/>
	</s:Group>
</s:SparkSkin>

Basta aplicar ele em qualquer textArea que ele vai mostrar a posição atual do cursor na palavra e terá um checkBox perguntando se você quer selecionar todo o texto ou não.

Para aplicar é simples:

	<s:TextArea skinClass="MyTextAreaSkin" id="meuTexto" x="72" y="81" minWidth="361" minHeight="276"
				prompt="Cole algum texto aqui" change="meuTexto_changeHandler(event)"/>

Chamei meu Skin de MyTextAreaSkin, fácil não? Começe agora mesmo a dedilhar cada nova classe do SDK, você vai ficar maravilhado com as simplicidades que ele traz e a facilidade de expandir.

Flash Builder 4.5/ Flex/ Flex 4.5

Corretor ortográfico em aplicações Flash/Flex/AIR

Já pensou em ter uma aplicação que possa corrigir erros ortográficos em alguns aplicativos, por exemplo, aplicações de edição de textos públicos, licitatórios, organizadores de documentos virtuais, edição de textos, em fim uma gama de aplicações são pertinentes ao assunto. E A Adobe tem há algum tempo uma biblioteca gratuita que você pode usar para adicionar essa funcionabilidade ao seu aplicativo.

A Squiggly, além de gratuita ela se baseia em dicionário público e open-source que é bastante utilizado nos navegadores Chrome, Firefox e a suite de office open-source Open-Office. Tem alguns bugs conhecidos, mais nada que lhe impeça de criar essa função em seu aplicativo.

E cá entre nós, praticamente 50% dos sistemas não tem um corretor ortográfico em campos como comentários adicionais, preenchimento de dados específicos como descrição de produtos, e acaba afetando, ou vai dizer que todo o texto que seu sistema controla é feito pelo Word?

Vamos lá fazer um exemplo.

Passo 1 – Criar um projeto
Passo 2 – Baixar o SWC do Squiggly.
Passo 3 – Adicionar o SWC’s do Squiggly no diretório lib de seu projeto. Os SWCs você vai encontrar direto na pasta libs do arquivo .zip que você baixou. Veja como ficou o meu abaixo.
squiggly

Agora, o resto é fácil. Veja um exemplo abaixo que criei. Lembre-se estou usando o Flex 4.5, funciona com Flash, AIR 2.0+ e em projetos Actionscript 3.0 puro. No .zip que você baixar vai encontrar vários exemplos.

Publicador

<?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/mx" minWidth="955" minHeight="600">
	<fx:Style>
		@namespace s "library://ns.adobe.com/flex/spark";
		s|Form s|FormItem
		{
			skinClass: ClassReference("spark.skins.spark.StackedFormItemSkin");
		}
		s|Form s|FormHeading
		{
			skinClass: ClassReference("spark.skins.spark.StackedFormHeadingSkin");
		}
	</fx:Style>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
 
	<s:Form x="170" y="45" width="487" height="486">
			<s:FormItem label="Título do post:" width="100%">
				<s:TextInput id="campoTitulo" width="100%"/>
			</s:FormItem>
			<s:FormItem label="Post:" width="100%">
				<s:TextArea id="campoCorpoTexto" width="100%" height="300">
 
				</s:TextArea>
			</s:FormItem>
			<s:Button width="135" height="35" label="Publicar" fontWeight="bold"/>
	</s:Form>
</s:Application>

Ok, até ai tudo bem, o problema agora é o seguinte, por padrão o Squiggly trás apenas o idioma en_US, para o corretor, o que nos faz pesquisar no Google e tentar achar outros idiomas, já que é gratuito e eu mencionei OpenOffice, então facilmente eu consigo esse dicionário em pt_BR. Ah! achei.

Com o dicionário em mãos, eu vou criar a seguinte estrutura em meu projeto.

squiggly_pt_br

Veja que tem a estrutura en_US, pt_BR dentro da pasta dictionaries, essas pastas por padrão estão dentro do pacote que você baixou do squiggly. Você vai encontrar ela (en_US) dentro da pasta src.

Agora o que você precisa fazer é mapear essa nova biblioteca que você adicionou(pt_BR) ao AdobeSpellingConfig.xml que está no projeto, ele tem o atual código.

<?xml version="1.0" encoding='UTF-8'?>
<spellingConfig>
  <languageResource language="English" languageCode="en_US" ruleFile="dictionaries/en_US/en_US.aff" dictionaryFile="dictionaries/en_US/en_US.dic"/>
</spellingConfig>

Troque por essa:

<?xml version="1.0" encoding='UTF-8'?>
<spellingConfig>
  <languageResource language="English" languageCode="en_US" ruleFile="dictionaries/en_US/en_US.aff" dictionaryFile="dictionaries/en_US/en_US.dic"/>
  <languageResource language="Português Brasil" languageCode="pt_BR" ruleFile="dictionaries/pt_BR/pt_BR.aff" dictionaryFile="dictionaries/pt_BR/pt_BR.dic"/>
</spellingConfig>

Adicione quantos idiomas você quiser. Agora voltamos ao código de nossa aplicação.

Eu peguei o código e apliquei as dependências do Squiggly. Então, veja como ficou.

<?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/mx" minWidth="955" minHeight="600" creationComplete="startMeuCorretor(event)">
	<fx:Style>
		@namespace s "library://ns.adobe.com/flex/spark";
		s|Form s|FormItem
		{
			skinClass: ClassReference("spark.skins.spark.StackedFormItemSkin");
		}
		s|Form s|FormHeading
		{
			skinClass: ClassReference("spark.skins.spark.StackedFormHeadingSkin");
		}
	</fx:Style>
	<fx:Script>
		<![CDATA[
			import com.adobe.linguistics.spelling.SpellUI;
			import com.adobe.linguistics.spelling.framework.ResourceTable;
			import com.adobe.linguistics.spelling.framework.SpellingConfiguration;
 
			import mx.events.FlexEvent;
 
			protected function startMeuCorretor(event:FlexEvent):void
			{
				// TODO Auto-generated method stub
				var dicionarios:ResourceTable = new ResourceTable();
			//opcional	dicionarios.setResource("en_US", {rule:"dicionaries/en_US/en_US.aff", dict:"dicionaries/en_US/en_US.dic"});
				dicionarios.setResource("pt_BR", {rule:"dicionaries/pt_BR/pt_BR.aff", dict:"dicionaries/pt_BR/pt_BR.dic"});
				SpellingConfiguration.resourceTable = dicionarios;
 
			}
 
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
 
	<s:Form x="170" y="45" width="487" height="486">
			<s:FormItem label="Título do post:" width="100%">
				<s:TextInput id="campoTitulo" width="100%" creationComplete="SpellUI.enableSpelling(campoTitulo, 'pt_BR');"/>
			</s:FormItem>
			<s:FormItem label="Post:" width="100%">
				<s:TextArea id="campoCorpoTexto" width="100%" height="300" creationComplete="SpellUI.enableSpelling(campoCorpoTexto,'pt_BR')">
 
				</s:TextArea>
			</s:FormItem>
			<s:Button width="135" height="35" label="Publicar" fontWeight="bold"/>
	</s:Form>
</s:Application>

Resultado final:

squiggly_post

Com isso, basta publicar sua aplicação com todas as dependências de dicionários e arquivos e sua aplicação estará pronta para corrigir os assassinos de palavras portuguesas.

Aproveita, é simples, legal de implementar. Até o próximo post.

Flash Builder/ Flash Builder 4.5/ Flex/ Flex para Gerentes

Criando aplicações Flex com o SAP netweaver gateway

O futuro do Flex não está reservado apenas ao mundo Mobile, com quase todas as vagas preenchidas para o próximo curso e lançamento da RIACycle(www.riacycle.com/flexmobile) a Adobe recentemente anunciou uma parceria inédia com a SAP.

A SAP é amplamente utilizada no mercado global de grandes corporações, repito, GIGANTES corporações usam o SAP.

No SaPPhire Now, principal evento da SAP, a Adobe lançou um protocolo de integração junto ao netweaver gateway que é também um produto novo da SAP para navegação e consumo dos dados que são gerados pelo NetWeaver , versão 7.0.2 acima, que já possui suporte ao gateway.



See how to build a simple Flex tablet application using SAP data accessed through the SAP NetWeaver Gateway. (9:58)

Vale muito a pena você assistir o video abaixo onde mostra a integração já nativa no Flash Builder Premium para uma nova release que sai em Junho, já com tal recurso. Visite também a página no Adobe Labs falando sobre essas aplicações Flex e SAP netweaver.

Flex/ Flex 4.5/ Flex Mobile Framework

Palestra Flex para smartphones

No próximo sábado. Terá uma palestra bem legal para quem quer se aventurar no mundo mobile e encarar o Flex nesse desenvolvimento.

Eu já palestrei sobre o assunto duas vezes, e acredite que ainda tem conteúdo novo. Irei mostrar diversas novidades do Flex 4.5 SDK para mundo Mobile (smartphones).
Curiosidades do Flash Builder 4.5, novos recursos, Source Mate 3.0.

A palestra é totalmente on-line as 14:00 horário de Brasília, essa palestra será para o grupo de usuários Flex Duck. Confira aqui os detalhes para a palestra.

AIR Mobile/ Android/ Dicas/ Flex/ Flex 4/ Flex Mobile Framework/ Tablets

Antes de comprar seu Android para testar o Flex leia esse post

Amigo leitor, você está totalmente satisfeito que agora o Flex está disponível na plataforma Android, Playbook e futuramente logo em junho ios.
O fato é que esse post é mais direcionado a você que está comprando um smartphone ou um tablet com Android apenas para testar o Flex nele ou criar soluções corporativas para sua empresa.
Hoje aconteceu uma coisa bem ruim com o Maurício Martins um de meus alunos do último curso de Adobe AIR Mobile. Ele comprou um Samsung Galaxy 551 apenas por suportar o Android 2.2 que é um dos pré-requisitos para você testar qualquer aplicação mobile na plataforma Android.

Infelizmente você acaba esquecendo que existem outros pre-requisitos importantes que devem ser levados em conta, como quantidade de memória instalada, resolução da tela, arquitetura do processador.
Então antes de sair comprando seu Android só por que já suporta 2.2, lembre-se desses fatores.
O que eu mais indico é visitar a lista de tablets, smartphones que já suportam o Adobe AIR e estão certificados pela Adobe para tal fim. Confira a lista aqui.

A lista pode sofrer mudanças constantemente, então é sempre bom ficar de olho nela, pois ela só lista o que realmente já foi testado pela própria Adobe e ela aconselha seus desenvolvedores e usuários finais a usar esses aparelhos.

Os requisitos técnicos para ter suporte ao Adobe AIR são:

MOBILE SYSTEM REQUIREMENTS

* Android devices
o Google Android™ 2.2 operating system
o ARMv7-A processor with vector FPU
o OpenGL ES 2
o H.264 and AAC hardware decoders
o 256MB of RAM
* BlackBerry™ Tablet OS
* iOS 3 and higher

AIR Mobile/ Flex/ Flex 4/ Flex Mobile Framework

Novo Flex 4.5 SDK e Flash Builder 4.5 disponível para download

É com grande alegria que anuncio a disponibilidade do Flex 4.5 SDK e o Flash Builder 4.5, foram 15 meses de desenvolvimento, alguns atrasos e finalmente a Adobe e o Flex Team se superaram em criar uma excelente ferramenta de desenvolvimento e framework para múltiplas telas.

Hoje com o Flex 4.5 você poderá criar aplicativos para Desktop, Web, Mobile, Tablets e TV. Fora essas grandes novidades de Mobile, a Adobe elaborou novos componentes para o Flex Desktop e Web como o Datagrid Spark, Form Spark, Formatadores e Validadores.

Uma lista completa das mudanças você pode conferir aqui no artigo da Deepa Subramaniam, que é Product Manager do Flex SDK.

Do lado Mobile, já tem disponível para compra o livro do Rich Tretola “Desenvolvendo aplicativos Flex 4.5 para Android“.