Escolar Documentos
Profissional Documentos
Cultura Documentos
Tecsul 2011
PATO BRANCO - PR
ii
Sumrio
Captulo 1: Introduo........................................................................................................1 1.1 O que Flex? ......................................................................................................................... 1 1.2 O que MXML? ..................................................................................................................... 1 1.3 O que Action Script? ........................................................................................................... 2 1.4 Instalando Adobe Flash Builder 4.5 ....................................................................................... 3 Captulo 2: Conhecendo o Flash Builder 4.5.........................................................................3 2.1 Conhecendo o Workbench do Flash Builder 4.5 ................................................................... 3 2.1.1 Perspective.......................................................................................................................... 4 2.1.2 Workspace .......................................................................................................................... 4 2.1.3 Editor................................................................................................................................... 4 2.1.4 Project ................................................................................................................................. 4 2.2 Tipos de Projetos no Flash Builder 4.5 .................................................................................. 5 Captulo 3: Criando o Projeto..............................................................................................6 3.1 Criando o Projeto Tecsul ....................................................................................................... 6 3.2 Adicionando arquivos Externos ........................................................................................... 10 3.3 API Key da Google................................................................................................................ 10 3.4 Manipulando a view TecsulHomeView ............................................................................... 11 3.4.1 Modo Design ..................................................................................................................... 11 3.4.2 Modo Source ..................................................................................................................... 17 3.5 Manipulando a view MapaView .......................................................................................... 21 3.5.1 Modo Design ..................................................................................................................... 22 3.5.2 Modo Source ..................................................................................................................... 24 3.5.3 Chamando o MapaView .................................................................................................... 28
Captulo 1: Introduo
Em maio de 2011 a Adobe lanou um conjunto de atualizaes em sua plataforma Flex trazendo diversas novidades nas mais variadas reas, sendo uma das principais mudanas o suporte ao desenvolvimento mobile. Este minicurso objetiva apresentar aos participantes uma introduo ao Flex SDK 4.5 no uso do desenvolvimento de aplicaes para plataforma mvel.
http://www.adobe.com/devnet-archive/flex/free/
Prof. Librio de Oliveira Jnior libajunior@gmail.com
2 Se voc nunca uso HTML, a IDE Flash Builder possui um modo chamado Design, no qual voc pode arrastar os componentes para a sua interface, montando ela como um todo (semelhante ao Delphi ou Windows Forms .NET). Um exemplo bsico de cdigo MXML exibido a seguir:
<s:Label x="9" y="140" width="186" id="Resultado:"/>
Neste exemplo, criamos um Label que possui coordenadas x e y dentro de uma aplicao, uma largura (width) de 186 pixels e o texto Resultado:. Assim, como uno HTML, podem-se adicionar componentes dentro de componentes e assim criar uma estrutura mais complexa, por exemplo:
<s:Group x="12" y="11" width="207" height="201"> <s:TextInput x="9" y="11" width="186" id="Operador1"/> <s:ComboBox x="9" y="39" openOnInput="true" width="186"/> <s:TextInput x="9" y="70" width="186" id="Operador2"/> <s:TextInput x="9" y="167" width="186" id="Resultado"/> <s:Label x="9" y="140" width="186" id="Resultado:"/> <s:Button x="9" y="97" width="186" label="Executar"/> </s:Group>
Neste cdigo criamos um grupo de componentes, posicionando cada um no eixo x/y. Poderamos tambm criar componentes lados a lado, tanto horizontalmente quanto verticalmente. O MXML existe porque muito mais fcil criar uma interface em uma linguagem declarativa (como o XML) do que imperativa (como o Action Script). Isto quer dizer que tudo que fazemos em MXML (ou quase tudo) pode ser feito com Action Script, mas desenhar interfaces algo extremamente frustrante. Para termos uma ideia, o cdigo anterior de 8 linhas vai para no mnimo 100 linhas em Action Script.
3 Todo o cdigo MXML relativo aos componentes torna-se cdigos Action Script3. Isto , o <s:Label /> que criamos no MXML, na verdade uma classe em Action Script. O compilador faz esta converso no momento em que estamos compilando o projeto. Fazendo uma analogia ao desenvolvimento web tradicional, a dobradinha MXML + Action Script pode ser comparada com o HTML + JavaScript.
http://www.adobe.com/products/flash-builder.html
Prof. Librio de Oliveira Jnior libajunior@gmail.com
4 utilizando a plataforma Eclipse, existem muitos conceitos que devem ser entendidos para que possamos extrair o mximo de produtividade da ferramenta.
2.1.1 Perspective
Todas as janelas internas do Flash Builder 4.5 podem ser alteradas de tamanho, com como alteradas de posio. Podem estas ocultas ou no. Como existem muitas janelas normalmente organizadas em abas, o Eclipse criou um conceito chamado de Perspective, que a perspectiva das janelas de acordo com o contexto da aplicao. A perspectiva exibida no canto superior direito da aplicao e inicialmente vem com o padro Flash. Ao selecionar uma perspectiva qualquer, a organizao das janelas muda completamente, incluindo abas e ocultando outras, tudo para atender a nova perspectiva.
2.1.2 Workspace
O conceito de workspace diferente de workbench. Um workspace caracterizado atravs de um arquivo de configurao que altera praticamente tudo dentro do Flash Builder 4.5. Apesar de pouco usado, este conceito pode ser til em determinadas situaes relacionadas configurao do eclipse. Por exemplo, suponha que voc tenha dois clientes e um deles um projeto Flex+PHP, com vrios projetos abertos no Flash Builder 4.5. Outro cliente j utiliza Flex+Java contendo mais alguns projetos relacionados Java. Ter todos estes projetos abertos em somente uma instncia do Flash Builder 4.5 trariam confuso na manipulao dos mesmos, alm de prejudicar a performance. Para isto, voc cria workspaces onde cada um deles ser destinado a um cliente ou a algum tipo de projeto. Para alterar o Workspace, voc pode acessar o menu File > Switch Workspace.
2.1.3 Editor
Um editor responsvel em editar arquivos do seu projeto, mas com a particularidade de possuir recursos extras para cada tipo de arquivo. Por exemplo, o editor de arquivos MXML possui o modo Source e o modo Design. J o editor de arquivo CSS apresenta outras particularidades. O mesmo vale para arquivos PHP, Java e Action Script.
2.1.4 Project
Um projeto a reunio de vrios arquivos de diversos tipos e diversos editores, com o propsito de representar a sua aplicao, seja ela web, desktop ou mobile. Veja que uma aplicao pode conter um ou mais projetos e que projetos podem ser compartilhados entre aplicaes.
Prof. Librio de Oliveira Jnior libajunior@gmail.com
5 Por exemplo, voc pode criar um projeto que contm somente componentes perolizados e pode criar vrios projetos que utilizam estes componentes.
Ao criar um novo projeto, temos a disposio sete tipos de projetos diferentes, veja: Flex Project: Cria um projeto Flex que pode ser executado na Web ou no Desktop e que pode conectar-se a diversos tipos de servidor, como ColdFusion, Java ou PHP. Flex Library Project: Cria uma biblioteca de componentes para o uso no Flex. Esta biblioteca pode, por exemplo, conter componentes que so compatveis com as verses Web, Desktop ou Mobile. Flex Mobile Project: Uma das grandes novidades desta verso e foco deste minicurso. Agora possvel criar projetos totalmente customizados para dispositivos mobile. Action Script Project: Pode-se criar um projeto totalmente em Action Script. Neste tipo de projeto, no so usados os arquivos MXML para desenho da aplicao e no h o recurso do Design de formulrios. Este tipo de projeto mais usado para a criao de jogos utilizando a plataforma Flex. Action Script Mobile Project: possui o mesmo conceito de Action Script Project, mas voltado para dispositivos mveis. Flash Professional Project: Cria um projeto Flash, porm necessrio ter o Flash Professional instalado no computador. Flash Catalyst Compatible Project: Cria um projeto que compatvel com o Flash Catalyst.
Este assistente tem 4 passos, sendo o primeiro deles exibidos na Figura 02. Nesta primeira tela voc deve informar o nome do projeto no campo Project Name, ou seja, digite Tecsul. Depois, voc indica aonde o projeto ser gravado (Project Location). Em nosso caso, devemos desmarcar a opo Use default location e no campo Folder informe o caminho C:\Tecsul2011\Tecsul. Em Flex SDK Version voc escolhe a verso do SDK que a aplicao ser compilada, neste caso o Default. Clique em Next para continuar.
7 No passo seguinte, devemos escolher o template da aplicao na guia Application Template, em nosso caso selecionaremos a View-Based Application e em Application settings, marque a opo Automatically reorient para que sua aplicao possa mudar o sentido vertical/horizontal quando o dispositivo e girado, como ilustra a Figura 03. Mude para a guia Permissions e marque a permisso INTERNET para que nossa aplicao possa fazer requisies a API do Google Maps e ACCESS_FINE_LOCATION para que possamos utilizar o GPS do dispositivo (Figura 04).
O terceiro passo do assistente utilizado para definir o acesso ao servidor. Como no estaremos ligando nossa aplicao a nenhuma aplicao de backend utilizando Java, PHP, ColdFusion ou .NET vamos deixar o item None selecionado. A aplicao Flex compilada e no interpretada. Ou seja, aps voc programar a aplicao, ser compilada e todos os arquivos (XML e action script) sero reunidos em um nico arquivo com a extenso swf. Esta compilao tambm gera alguns arquivos extras e todos eles so criados no diretrio que est informado em Output folder. Por isto, deixe o bin-debug como padro, como est ilustrado na Figura 05, e clique em Next.
O ltimo passo chamado de Build Paths onde diversas configuraes so realizadas. Em Framework Linkage, definimos se o framework Flex ser adicionado junto aplicao ou em separado. Isto significa que voc pode ter uma aplicao com aproximadamente 100K e um framework com quase 1.5M, ou ento ter apenas um arquivo SWF com quase 1.6M. Vamos deixar o padro, que manter o framework separado, chamado de RSL. Em Build path libraries podemos adicionar novas bibliotecas (arquivos SWC) ao projeto. Podem-se adicionar novas bibliotecas em qualquer momento do desenvolvimento da aplicao. A seguir, temos quatro configuraes relacionadas s bibliotecas RSL, so elas:
9 Verify RSL digests: Verifica se os arquivos swf do framework so os mesmo da aplicao e do servidor. Esta verificao realizada atravs de um hash de nmeros (da o nome digest). Se voc desmarcar esta caixa sua aplicao poder usar os arquivos SWF de outra aplicao, podendo assim otimizar o seu carregamento, mas tambm apresentar problemas de segurana. Remove unused RSLs: Remove as bibliotecas que no so usadas. Ou seja, se voc no usar nenhum componente de uma determinada biblioteca, ela no ser copiada para o output folder. Use local debug RSL when debbuging: Com esta opo marcada, voc pode debugar o framework internamente, pois o mesmo open source. Automatically Determine Library Order Based On Dependencies: Determina automaticamente a ordem de carregamento das bibliotecas do framework. Aps estas configuraes, existem trs caixas de texto para a alterao de pastas e arquivos do projeto. So eles: Main source folder: O nome da pasta que conter o cdigo fonte do projeto. Deixe o padro src. Main application file: O nome do arquivo MXML da aplicao principal. Application ID: usado pela runtime AIR e pelo sistema operacional para identificar o aplicativo. A fim de garantir um nico Application ID, utilizamos uma conveno de nomenclatura que utilizar o domnio com o nome invertido. Por exemplo: br.org.tecsul. Para o nosso projeto, altere o valor deste campo para br.org.tecsul.tecsul2011. Precisaremos adicionar duas bibliotecas ao path libraries: a as3corelib que ir permitir a comunicao com a API do Google (a qual utilizaremos o formato JSON) e a Tecsul2011 que possui o componente do Google Maps. Clique no boto Add SWC e localize o arquivo as3corelib.swc que est no diretrio C:\Tecsul2011\library\ e clique em OK para adicionar. Repita o procedimento agora adicionando o arquivo Tecsul2011.swc. As configuraes do Build Path devero ficar como a Figura 07.
10
http://code.google.com/intl/pt-BR/apis/maps/signup.html
Prof. Librio de Oliveira Jnior libajunior@gmail.com
11
Localizar na barra Components (Windows > Show View > Components) o componente Image e arrast-lo para dentro da view. Na sequencia, localizar o componente BusyIndicator e arrastar para dentro da view posicionando-o sob o componente Image. Por fim, localize o componente Label e o arraste para baixo do BusyIndicator, deixando a view com a aparncia da Figura 09.
12 Clique sobre o componente Image e na barra de propriedades localize o campo Source, clique sobre o cone e escolha a opo Single Bitmap. Navegue at o diretrio
C:\Tecsul2001\Tecsul\src\assets, escolha a imagem alert.gif e clique no boto Abrir. Vamos agora embutir a imagem alert.png em nosso projeto marcando a opo Embed que est logo abaixo do campo Source.
Voc dever ponderar o uso de imagens embutidas, pois isto ir interferir diretamente no tamanho do teu arquivo final.
Clique agora sobre o componente label inserido na view e altere suas propriedades. Localize o campo ID e digite statusLabel e apague o texto Label do campo Text, deixando-o em branco. Ao final, clique no boto OK. Ao final, as propriedades devero ficar como mostra a Figura 11:
13
A view TecsulHomeView ter trs estados de visualizao (States): GPS No Suportado, Carregando e Normal. Para criar estes estados de visualizao, acesse o menu Windows > Show View > States. Na barra de States, clique no boto (New State). Na janela que ir
surgir informe o Name naosuportado e clique no boto OK. Repita a operao, s que agora informe o Name como carregando. A Figura 12 mostra a janela de New State dos dois casos.
Para finalizar a criao dos states precisamos criar o estado Normal. Para esse ltimo no vamos criar um novo State como foi feito nos passos anteriores, vamos apenas alterar o nome do State1. Para isto, clique sobre o State1 na barra de States, e clique no boto State Properties). Altere o Name para normal e clique no boto OK, conforme Figura 13. (Edit
14
Criados os States, precisamos configurar o que ser exibido em cada um deles. Iniciaremos pelo GPS No Suportado (naosuportado), pois neste estado dever ser exibido a imagem de alerta e o statusLabel. Clique sobre a imagem e localize a propriedade In states. Clique no campo e marque apenas o state em que voc deseja que aparea a imagem. Neste caso, marque somente o state naosuportado deixando-o como a Figura 14.
Repita o procedimento para o BusyIndicator, porm escolha o state carregando, como pode ser visto na Figura 15.
15
No caso do statusLabel, vamos deixa-lo visvel em dois states: naosuportado e carregando, pois este componente ser utilizado para exibir o status do sistema. Veja como ficou sua propriedade na Figura 16.
Aplicando um pouco de regras de usabilidade, vamos configurar nosso statusLabel para quando entrar no state de naosuportado, a aplicao dever mostrar a cor do texto como vermelho. Para isto, mude para o state naosuportado, selecione o statusLabel e clique sobre o quadro preto para alterar a cor da fonte. Surgir uma janela chamada Color Picker, informe os valores 160, 20 e 0 para os campos R: G: B:, respectivamente. A Figura 17 demostra como dever ser configurada o Color Picker.
16
Sempre que for alterar alguma propriedade de um componente ou fazer qualquer tipo de alterao, certifique-se que esteja fazendo isto na state correta.
Continuando com a implementao da view TecsulHomeView, precisamos agora definir quais elementos sero exibidos no state normal. Selecione o state normal e arraste um componente Image para a view. Define o Source (da mesma forma que foi feito na imagem de alerta) apontando para a imagem logomarca.gif. Arraste agora um List sob a imagem de logomarca e defina na barra de propriedades deste List a largura (width) e a altura (height) com 100% e o ID como tiposList, conforme na Figura 18.
A view TecsulHomeView deve estar com a aparncia parecida com a Figura 19:
17
Procure o caractere > que aparece antes da tag <s:layout> e posicione o mouse antes deste caractere. Pressione a tecla Enter para fazer uma quebra de linha. Adicione o evento creationComplete, deixando como o bloco abaixo:
TecsulHomeView.mxml <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" tabBarVisible="true" title="O que voc precisa?" creationComplete=""> <s:layout> <s:VerticalLayout horizontalAlign="center" paddingTop="5"/> </s:layout>
18 Posicione o cursos do mouse entre as aspas duplas depois do evento e pressione a combinao de teclas Alt + Barra Espao. Ir surgir a janela de assistente de cdigo sugerindo a ao Generate CreationComplete Handler. Pressione Enter e crie um mtodo chamado init para este evento. Ficar como o bloco abaixo:
TecsulHomeView.mxml <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" tabBarVisible="true" title="O que voc precisa?" creationComplete="init(event)"> <s:layout> <s:VerticalLayout horizontalAlign="center" paddingTop="5"/> </s:layout>
Perceba que entre as tags s:layout e s:states foi criado uma tag s:Script idntico ao bloco abaixo:
TecsulHomeView.mxml <?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" tabBarVisible="true" title="O que voc precisa?" creationComplete="init(event)"> <s:layout> <s:VerticalLayout horizontalAlign="center" paddingTop="5"/> </s:layout> <fx:Script> <![CDATA[ import mx.events.FlexEvent; protected function init(event:FlexEvent):void { // TODO Auto-generated method stub } ]]> </fx:Script> <s:states> <s:State name="normal"/> <s:State name="naosuportado"/> <s:State name="carregando"/> </s:states>
19
protected function init(event:FlexEvent):void { if (Geolocation.isSupported) { if (this.gps.muted) { currentState = "naosuportado"; statusLabel.text = "O Acesso ao GPS foi negado"; } this.currentState = "carregando"; statusLabel.text = "Procurando sua geolocalizao"; this.gps.addEventListener(GeolocationEvent.UPDATE, onUpdateHandler); this.addEventListener(ViewNavigatorEvent.REMOVING,onRemoveHandler); } else { currentState = "normal"; this.lat=-26.2166667; this.lng=-52.6666667; } } private function onUpdateHandler(event:GeolocationEvent):void { this.lat = event.latitude; this.lng = event.longitude; this.currentState = "normal"; } private function onRemoveHandler(event:ViewNavigatorEvent):void { this.gps.removeEventListener(GeolocationEvent.UPDATE, onUpdateHandler); } ]]> </fx:Script>
Precisamos agora alimentar nossa lista de tipos de servios. Para isto vamos utilizar uma lista baseadas no Supported Place Types4 do Google que uma lista de tipos de lugares que a API do Google Maps suporta. Esta lista est implementada na biblioteca Tecsul2011.swc e o seu fonte pode ser encontrado no diretrio com o material do Tecsul2011. Para pegarmos esta lista, precisamos fazer algumas alteraes na tag List, como pode ser visto logo abaixo:
TecsulHomeView.mxml <s:List id="tiposList" includeIn="normal" width="100%" height="100%" dataProvider="{Consts.tipos}"/>
Logo aps digitar Consts pressione a combinao de teclas Alt + Espao para fazer o import da classe br.org.tecsul.Consts. Podemos testar agora nosso projeto. Ao clicar no boto para executar a aplicao,
ir surgir uma tela de configurao chamada Run Configurations. Marque a opo n desktop e selecione a opo Motorola Droid 2 conforme a Figura 20.
http://code.google.com/intl/pt-BR/apis/maps/documentation/places/supported_types.html
Prof. Librio de Oliveira Jnior libajunior@gmail.com
20
21
{ this.lat = event.latitude; this.lng = event.longitude; this.currentState = "normal"; } private function onRemoveHandler(event:ViewNavigatorEvent):void { this.gps.removeEventListener(GeolocationEvent.UPDATE, onUpdateHandler); } ]]> </fx:Script> <s:states> <s:State name="normal"/> <s:State name="naosuportado"/> <s:State name="carregando"/> </s:states> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <s:Image includeIn="normal" height="60" source="@Embed('assets/logomarca.gif')"/> <s:Image includeIn="naosuportado" source="@Embed('assets/alert.gif')"/> <s:BusyIndicator includeIn="carregando"/> <s:Label id="statusLabel" includeIn="carregando,naosuportado" color.naosuportado="#A01400"/> <s:List id="tiposList" includeIn="normal" width="100%" height="100%" dataProvider="{Consts.tipos}"/> </s:View>
22
Figura 22: Boto sendo arrastado para rea invisvel chamada actionContent
Ainda no boto Voltar, localize a opo On click na barra de propriedades e digite {navigator.popView()}. Isto far com que voltemos ao TecsulHomeView ao clicar neste boto. Vamos repetir os procedimentos feito na view TecsulHomeView, definindo para o view MapaView as propriedades Align como Center e Top como 5. Na sequencia, incluindo uma imagem (alert.gif) um BusyIndicator e um Label. Aponte o source do componente Image para o alert.gif e marque a opo Embutir. Nomeie o componente Label como statusLabel e apague o texto do mesmo. A view MapaView tambm ter os mesmo estados de visualizao do TecsulHomeView. Repita os passos para criao dos States naosuportado, carregando e normal. Repita tambm a configurao dos componentes que sero exibidos em cada state:
Prof. Librio de Oliveira Jnior libajunior@gmail.com
23 naosuportado aparece apenas imagem de alerta e o statusLabel; carregando aparece o BusyIndicator e o statusLabel. No se esquea de mudar a cor do label statusLabel quando ele estiver no state carregando. Selecionando o State normal, adicione uma imagem com a logo do Tecsul, como fizemos na view TecsulHomeView. Localize o componente GMaps e arraste para baixo da logo inserida anteriormente. Na barra de propriedades, defina a largura (width) e altura (height) com 100%. A Figura 23 demostra como ficar o resultado final da view.
Antes de iniciarmos a codificao, na barra de States, selecione o state carregando e clique no boto (Edit State Propertie). Na janela que ir surgir (Figura 23) marque a opo
24
Precisamos criar um mtodo que ser disparado quando a view for ativada. Este mtodo tambm receber parmetros vindos da view TecsulHomeView. Veja no bloco abaixo as alteraes feitas no bloco anterior.
MapaView.mxml
<?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:tecsul="br.org.tecsul.*" currentState="carregando" title="MapaView" viewActivate="activeHandler(event)"> <s:layout> <s:VerticalLayout horizontalAlign="center" paddingTop="5"/> </s:layout> <fx:Script> <![CDATA[ import spark.events.ViewNavigatorEvent; protected function activeHandler(event:ViewNavigatorEvent):void { // TODO Auto-generated method stub } ]]> </fx:Script>
Vamos implementar o mtodo activeHandler conforme o bloco abaixo. Primeiramente precisaremos declarar alguns atributos que iremos utilizar e dentro do mtodo iremos alimentar estes atributos com valores vindos da view TecsulHomeView. O nico atributo que no ser alimentado pela view anterior o atributo lugares. Este atributo na verdade ser uma lista de lugar que a API do Google ir retornar baseado no parmetro tipo.
25
MapaView.mxml
<fx:Script> <![CDATA[ import mx.collections.ArrayCollection; import spark.events.ViewNavigatorEvent; [Bindable] [Bindable] [Bindable] [Bindable] [Bindable] private private private private private var var var var var tipo: String; tipoLabel: String; myLat: Number; myLng: Number; lugares: ArrayCollection;
protected function activeHandler(event:ViewNavigatorEvent):void { this.tipo = data.selected.id; this.tipoLabel = data.selected.label; this.myLat = data.lat; this.myLng = data.lng; statusLabel.text = "Carregando "+ this.tipoLabel +"..."; } ]]> </fx:Script>
Altere o title da view para {this.tipoLabel} para que mostre o ttulo do tipo. Para que seja feito a requisio da API, precisamos adicionar um componente no visual que responsvel por fazer chamadas HTTP. Localize a tag <fx:Declarations> e implemente conforme o bloco abaixo:
MapaView.mxml
<fx:Declarations> <s:HTTPService id="httpService" result="event.token.resultHandler(event)" fault="event.token.faultHandler(event)" /> </fx:Declarations>
Continuando a codificao do mtodo activeHandler, precisamos agora chamar a API do Google solicitando uma lista de lugar contendo os lugares classificados pelo Google por tipo. Nesta requisio precisaremos tambm repassar o API Key da aplicao e o raio (5000m), em metros, que os lugares devero estar da geolocalizao do seu dispositivo.
MapaView.mxml
protected function activeHandler(event:ViewNavigatorEvent):void { this.tipo = data.selected.id; this.tipoLabel = data.selected.label; this.myLat = data.lat; this.myLng = data.lng; statusLabel.text = "Carregando "+ this.tipoLabel +"..."; var url url url url:String = "https://maps.googleapis.com/maps/api/place/search/json?"; += "location="+ this.myLat.toString() +","+ this.myLng.toString(); += "&radius=5000&types="+ this.tipo +"&key="+ Consts.APIKEY; += "&sensor=true";
26
}
Precisamos agora criar dois mtodos: o onResultHandler que ser disparado se tudo der certo e o onFaultHandler que ser disparado se ocorrer algum erro na requisio. O bloco de Scripts ficar como o abaixo:
MapaView.mxml
<fx:Script> <![CDATA[ import br.org.tecsul.Consts; import com.adobe.serialization.json.JSON; import import import import mx.collections.ArrayCollection; mx.rpc.AsyncToken; mx.rpc.events.FaultEvent; mx.rpc.events.ResultEvent;
import spark.events.ViewNavigatorEvent; [Bindable] [Bindable] [Bindable] [Bindable] [Bindable] private private private private private var var var var var tipo: String; tipoLabel: String; myLat: Number; myLng: Number; lugares: ArrayCollection;
protected function activeHandler(event:ViewNavigatorEvent):void { this.tipo = data.selected.id; this.tipoLabel = data.selected.label; this.myLat = data.lat; this.myLng = data.lng; statusLabel.text = "Carregando "+ this.tipoLabel +"..."; var url url url url:String = "https://maps.googleapis.com/maps/api/place/search/json?"; += "location="+ this.myLat.toString() +","+ this.myLng.toString(); += "&radius=5000&types="+ this.tipo +"&key="+ Consts.APIKEY; += "&sensor=true";
httpService.url = url; var async:AsyncToken = httpService.send(); async.resultHandler = onResultHandler; async.faultHandler = oFaultHandler; } private function onResultHandler(event:ResultEvent): void { var resultData:Object = JSON.decode(event.result.toString()); if (resultData.status == "OK") { this.lugares = new ArrayCollection(resultData.results); currentState = "normal"; } else if(resultData.status == "ZERO_RESULTS") { currentState = "naosuportado"; statusLabel.text = "Nenhum registro foi encontrado"; } else { currentState = "naosuportado"; statusLabel.text = resultData.status; } } private function oFaultHandler(event:FaultEvent): void { currentState = "naosuportado"; statusLabel.text = event.fault.toString(); } ]]> </fx:Script>
27 Entendendo o mtodo onResultHandler: Como este mtodo disparado quando a API do Google responder a requisio e como o formato de resposta um JSON, precisamos converter o retorno em um objeto JSON. Na sequencia, feito uma verificao para saber se o retorno est OK (existes lugares para o tipo escolhido) se ZERO_RESULTS (se no encontrou nenhum lugar) e se ocorreu algum erro. Se o retorno for OK, alimenta o atributo lugares com os lugares encontrados e mostra o estado normal da view. Se no encontrar nenhum lugar (ZERO_RESULTS), simplesmente muda para o state naosuportado e mostra a mensagem que no encontrou nenhum registro. Se der algum erro, ou seja, se o retorno no for nem OK e nem ZERO_RESULTS, mostra o state nosuportado com o retorno enviado. J no mtodo onFaultHandler, foi implementado para, se ocorrer algum erro na requisio, direciona para o state naosuportado e mostra o erro que ocorreu. Ao final, o cdigo fonte dever ficar como o abaixo:
MapaView.mxml
<?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:tecsul="br.org.tecsul.*" currentState="carregando" title="MapaView" viewActivate="activeHandler(event)"> <s:layout> <s:VerticalLayout horizontalAlign="center" paddingTop="5"/> </s:layout> <fx:Script> <![CDATA[ import br.org.tecsul.Consts; import com.adobe.serialization.json.JSON; import import import import mx.collections.ArrayCollection; mx.rpc.AsyncToken; mx.rpc.events.FaultEvent; mx.rpc.events.ResultEvent;
import spark.events.ViewNavigatorEvent; [Bindable] [Bindable] [Bindable] [Bindable] [Bindable] private private private private private var var var var var tipo: String; tipoLabel: String; myLat: Number; myLng: Number; lugares: ArrayCollection;
protected function activeHandler(event:ViewNavigatorEvent):void { this.tipo = data.selected.id; this.tipoLabel = data.selected.label; this.myLat = data.lat; this.myLng = data.lng; statusLabel.text = "Carregando "+ this.tipoLabel +"...";
var url:String = "https://maps.googleapis.com/maps/api/place/search/json?";
url += "location="+ this.myLat.toString() +","+ this.myLng.toString(); url += "&radius=5000&types="+ this.tipo +"&key="+ Consts.APIKEY; url += "&sensor=true"; httpService.url = url; var async:AsyncToken = httpService.send(); async.resultHandler = onResultHandler;
28
async.faultHandler = oFaultHandler; } private function onResultHandler(event:ResultEvent): void { var resultData:Object = JSON.decode(event.result.toString()); if (resultData.status == "OK") { this.lugares = new ArrayCollection(resultData.results); currentState = "normal"; } else if(resultData.status == "ZERO_RESULTS") { currentState = "naosuportado"; statusLabel.text = "Nenhum registro foi encontrado"; } else { currentState = "naosuportado"; statusLabel.text = resultData.status; } } private function oFaultHandler(event:FaultEvent): void { currentState = "naosuportado"; statusLabel.text = event.fault.toString(); } ]]> </fx:Script> <s:states> <s:State name="normal"/> <s:State name="naosuportado"/> <s:State name="carregando"/> </s:states> <fx:Declarations> <s:HTTPService id="httpService" result="event.token.resultHandler(event)" fault="event.token.faultHandler(event)" /> </fx:Declarations> <s:actionContent> <s:Button label="Voltar" click="{navigator.popView()}"/> </s:actionContent> <s:Image includeIn="naosuportado" source="@Embed('assets/alert.gif')"/> <s:BusyIndicator includeIn="carregando"/> <s:Label id="statusLabel" includeIn="carregando,naosuportado" color.naosuportado="#A01400"/> <s:Image includeIn="normal" source="@Embed('assets/logomarca.gif')"/> <tecsul:GMaps id="gmaps" includeIn="normal" width="100%" height="100%" placeList="{this.lugares}"/> </s:View>
Antes dos caracteres \> digite click= e pressione as teclas Ctrl + Barra para chamar o wizard, escolha a opo Generater Click Handler e digite clickHandler.
TecsulHomeView.mxml <s:List id="tiposList" includeIn="normal" width="100%" height="100%" dataProvider="{Consts.tipos}" click="clickHandler(event)"/>
29 Ser gerado ao final da tag Script um mtodo chamado clickHandler. Implemente como o bloco a seguir.
TecsulHomeView.mxml
protected function clickHandler(event:MouseEvent):void { navigator.pushView(MapaView,{selected:tiposList.selectedItem,lat:lat,lng:lng}); }
30
<s:State name="naosuportado"/> <s:State name="carregando"/> </s:states> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <s:Image includeIn="normal" height="60" source="@Embed('assets/logomarca.gif')"/> <s:Image includeIn="naosuportado" source="@Embed('assets/alert.gif')"/> <s:BusyIndicator includeIn="carregando"/> <s:Label id="statusLabel" includeIn="carregando,naosuportado" color.naosuportado="#A01400"/> <s:List id="tiposList" includeIn="normal" width="100%" height="100%" dataProvider="{Consts.tipos}" click="clickHandler(event)"/> </s:View>
31
REFERNCIAS BIBLIOGRFICAS
SCHMITZ, Daniel. Dominando Adobe Flex 4.5. Editora Prpria. So Paulo, 2011. SCHMITZ, Daniel. Dominando o Flex e Java. Editora Prpria. So Paulo, 2010. CAMDEN, Raymond. ColdFusion Jedi: INeedIt - Simple Flex Mobile example. Disponvel em < http://migre.me/5GBOx>. Acessado em: 09/09/2011.