logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Jan 11

Dica Flex – O padrão Factory Method

Escrito por Pablo Souza em 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Adobe, app, AR, Arquitetura, bar, blog, botão, C#, class, classe, classes, cliente, código, Componente, Componentes, control, dados, Design Patterns, Dica, Dicas, err, erro, error, event, exemplo, Flex, fonte, fonts, for, framework, Frameworks, function, handle, ide, IE, if, image, int, interface, Java, label, library, Mac, mg, monitor, MXML, O, on, override, padrão, problema, problemas, Projetos, pt, RIA, Ria’s Geral, RoR, singleton, spark, string, tag, template, UI, XML @ 01 11th, 2011 | via http://rectius.com.br/blog | Sem comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Quando passamos algum tempo modelando aplicações, é fato que vamos nos deparar com um mesmo problema várias e várias vezes. Ao longo do tempo também vamos encontrar maneiras de resolvê-los. A solução para esses problemas recorrentes é a chave para os padrões de projetos. Padrões de projetos não são métodos, frameworks ou componentes, são dicas de como resolver problemas conhecidos de forma eficaz.

Aqui no blog nós já falamos de alguns padrões de projetos como o Singleton, Transfer Object e o Typesafe Enum. Na dica Flex de hoje, vamos mostrar como implementar o padrão de projeto Factory Meythod que, assim como os citados anteriormente, tem papel arquitetural importante nas suas aplicações.

O padrão Factory provê uma abstração ou uma interface e permite que a subclasse ou a classe de implementação decida qual classe ou método deve ser instanciado ou chamado, baseado nas condições ou parâmetros informados.

Algumas de suas características são:

- Esconde as classes concretas do cliente.
- Junta duas ou mais hierarquias de classes separadas porém relacionadas.
- O objeto retornado pode ser tanto um objeto concreto quanto abstrato.
- As subclasses são quem especificam os objetos.

Para ilustrar esses conceitos utilizaremos um exemplo simples, vamos criar uma aplicação que informa a condição do tráfego nas estradas do RJ e SP.

Então mãos a obra.

Crie sua aplicação “FactoryMethodExample”:

Em seguida modifique sua Application conforme o código a seguir:

<?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">
?
	<s:controlBarContent>
		<s:Label text="CONDIÇÕES DO TRÁFEGO NAS ESTRADAS"  fontWeight="bold" fontSize="16"/>
		<s:Button id="btTrafegoSP" label="Obtêm condições do tráfego em SP" />
	s:controlBarContent>
?
	<s:TextArea id="report" left="50" right="50" bottom="50" top="50"/>
?
s:Application>

Basicamente, nossa aplicação deverá passar por três passos antes de informar as condições do tráfego ao usuário:

1. Obter as informações do tráfego.
2. Tratar o retorno dessas informações.
3. Retornar as informações formatadas.

Vamos criar um classe abstrata com um método Template Method que irá garantir que os três passos anteriores sejam respeitados.
Diferentemente do C# e do Java, o ActionScript 3.0 não suporta nativamente a criação de classes ou métodos abstratos. A classe abstrata é uma classe que sempre é estendida e nunca pode ser instanciada diretamente. Os métodos abstratos devem ser implementados pela subclasse e, como o ActionScript 3.0 não provê suporte para a palavra-chave “abstract”, vamos garantir esse comportamento lançando uma exceção.

Veja a classe abstrata “AbstractTrafego”:

package
{
	public class AbstractTrafego
	{
		public final function inicializa():String
		{
			obtemInformacoes();
			trataInformacoes();
			return retornaInformacoes();
		}
?
		public function obtemInformacoes():void
		{
			throw new Error("Método Abstrato");
		}
?
		public function trataInformacoes():void
		{
			throw new Error("Método Abstrato");
		}
?
		public function retornaInformacoes():String
		{
			throw new Error("Método Abstrato");
		}
?
	}
}

Agora vamos criar a classe SPTrafego que estende nossa classe abstrata AbstractTrafego. Essa subclasse implementa os métodos chamados pelo Template Method Inicializa:

package
{
	public class SPTrafego extends AbstractTrafego
	{
		private var condicoesTrafego:String = "";
		private var arrCondicoesTrafego:Array = [];
?
		public override function obtemInformacoes():void
		{
			var trafego_1:Object = new Object();
			trafego_1.rodovia = "Marginal Pinheiros";
			trafego_1.condicao = "Congestionada em 6 km";
?
			var trafego_2:Object = new Object();
			trafego_2.rodovia = "Marginal Tietê";
			trafego_2.condicao = "Congestionada em 8 km";
?
			arrCondicoesTrafego.push(trafego_1);
			arrCondicoesTrafego.push(trafego_2);
?
			trace("Obtem as informações do tráfego em SP");
		}
?
		public override function trataInformacoes():void
		{
			condicoesTrafego += "Última atualização: " + new Date() + "n";
			condicoesTrafego += "Condições do Tráfego em SPn";
			for each (var informe:Object in arrCondicoesTrafego)
			{
				condicoesTrafego += informe.rodovia + ": ";
				condicoesTrafego += informe.condicao + "n";
			}
			condicoesTrafego += "r";
?
			trace("Trata as informações do tráfego em SP");
		}
?
		public override function retornaInformacoes():String
		{
			trace("Retorna as informações do tráfego em SP");
?
			return condicoesTrafego;
		}
	}
}

Agora vamos testar nossa implementação. Insira o código a seguir no clique do botão btTrafegoSP:

	<fx:Script>
		[CDATA[
?
			protected function btTrafegoSP_clickHandler(event:MouseEvent):void
			{
				// Cria uma instância de SPTrafego
				var trafego:SPTrafego = new SPTrafego();
				// Chama o Template Method definido na classe abstrata
				report.text += trafego.inicializa();
			}
		]]>
	fx:Script>

Rode o código e veja o resultado.

Nesse momento nossa aplicação está implementando apenas o Template Method. Para entendermos as vantagens de se utilizar o Factory Method, digamos agora que vamos passar também a monitorar o tráfego das estradas do RJ e para isso vamos precisar nos conectar a uma fonte de dados diferente daquela usada para obter as informações de SP. Como teremos agora diferentes fontes de dados, vamos refatorar nosso código. O método ObtemInformacao não retorna nada atualmente, então vamos modificá-lo para que ele passe a retornar um objeto que represente as condições do tráfego.

Crie uma interface chamada ICondicao, que deverá ser implementada por todos esses objetos.

package
{
	public interface ICondicao
	{
		function obtemDados():void;
	}
}

Agora vamos criar as classes que implementam a interface ICondicao:

package
{
	public class SPCondicao implements ICondicao
	{
		public function obtemDados():Array
		{
			trace("Obtem dados do tráfego em SP");
?
			var trafego_1:Object = new Object();
			trafego_1.rodovia = "Marginal Pinheiros";
			trafego_1.condicao = "Congestionada em 6 km";
?
			var trafego_2:Object = new Object();
			trafego_2.rodovia = "Marginal Tietê";
			trafego_2.condicao = "Congestionada em 8 km";
?
			var arrCondicoesTrafego:Array = [];
?
			arrCondicoesTrafego.push(trafego_1);
			arrCondicoesTrafego.push(trafego_2);
?
			return arrCondicoesTrafego;
		}
	}
}

Agora a classe que obtem os dados das estradas do RJ. Repare que as informações estão num formato diferente.

package
{
	public class RJCondicao implements ICondicao
	{
		public function obtemDados():Array
		{
			trace("Obtem dados do tráfego no RJ");
?
			arrCondicoesTrafego.push("Avenida Brasil: Congestionada em 5 km");
			arrCondicoesTrafego.push("Ponte Rio-Niterói: Congestionada em 2 km");
?
			return arrCondicoesTrafego;
		}
	}
}

Em seguida refatore a classe abstrata AbstractTrafego. Perceba que agora o método obtemInformacoes retorna um objeto do tipo ICondicao, que pode ser tanto um objeto relacionado às condições das estradas do RJ quanto de SP ou de qualquer outra cidade que venha a ser adicionada posteriormente:

package
{
	public class AbstractTrafego
	{
		public final function inicializa():String
		{
			var condicao:ICondicao = obtemInformacoes();
			trataInformacoes(condicao.obtemDados());
			return retornaInformacoes();
		}
?
		// Método Factory
		public function obtemInformacoes():ICondicao
		{
			throw new Error("Método Abstrato");
		}
?
		public function trataInformacoes(arrCondicoesTrafego:Array):void
		{
			throw new Error("Método Abstrato");
		}
?
		public function retornaInformacoes():String
		{
			throw new Error("Método Abstrato");
		}
?
	}
}

Refatore agora a implementação da classe abstrata SPTrafego:

package
{
	public class SPTrafego extends AbstractTrafego
	{
		private var condicoesTrafego:String = "";
?
		public override function obtemInformacoes():ICondicao
		{
			return new SPCondicao();
		}
?
		public override function trataInformacoes(arrCondicoesTrafego:Array):void
		{
			condicoesTrafego += "Última atualização: " + new Date() + "n";
			condicoesTrafego += "Condições do Tráfego em SPn";
			for each (var informe:Object in arrCondicoesTrafego)
			{
				condicoesTrafego += informe.rodovia + ": ";
				condicoesTrafego += informe.condicao + "n";
			}
			condicoesTrafego += "r";
?
			trace("Trata as informações do tráfego em SP");
		}
?
		public override function retornaInformacoes():String
		{
			trace("Retorna as informações do tráfego em SP");
?
			return condicoesTrafego;
		}
	}
}

E crie a classe RJTrafego:

package
{
	public class RJTrafego extends AbstractTrafego
	{
		private var condicoesTrafego:String = "";
?
		public override function obtemInformacoes():ICondicao
		{
			return new RJCondicao();
		}
?
		public override function trataInformacoes(arrCondicoesTrafego:Array):void
		{
			condicoesTrafego += "Última atualização: " + new Date() + "n";
			condicoesTrafego += "Condições do Tráfego no RJn";
			for each (var informe:String in arrCondicoesTrafego)
			{
				condicoesTrafego += informe + "n";
			}
			condicoesTrafego += "r";
?
			trace("Trata as informações do tráfego no RJ");
		}
?
		public override function retornaInformacoes():String
		{
			trace("Retorna as informações do tráfego no RJ");
?
			return condicoesTrafego;
		}
	}
}

E por último mas não menos importante, vamos refatorar nossa Application:

<?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[
?
			protected function btTrafegoSP_clickHandler(event:MouseEvent):void
			{
				// Cria uma instância de SPTrafego
				var trafego:SPTrafego = new SPTrafego();
				// Chama o Template Method definido na classe abstrata
				adicionaInforme( trafego );
			}
?
			protected function btTrafegoRJ_clickHandler(event:MouseEvent):void
			{
				// Cria uma instância de SPTrafego
				var trafego:RJTrafego = new RJTrafego();
				// Chama o Template Method definido na classe abstrata
				adicionaInforme( trafego );
			}
?
			private function adicionaInforme(trafego:AbstractTrafego):void
			{
				report.text += trafego.inicializa();
?
			}
?
		]]>
	fx:Script>
?
	<s:controlBarContent>
		<s:Label text="CONDIÇÕES DO TRÁFEGO NAS ESTRADAS"  fontWeight="bold" fontSize="16"/>
		<s:Button id="btTrafegoSP" label="Obtêm condições do tráfego em SP"
				  click="btTrafegoSP_clickHandler(event)" />
?
		<s:Button id="btTrafegoRJ" label="Obtêm condições do tráfego no RJ"
				  click="btTrafegoRJ_clickHandler(event)" />
	s:controlBarContent>
?
	<s:TextArea id="report" left="50" right="50" bottom="50" top="50"/>
?
s:Application>

Espero que tenham gostado. Baixe aqui o projeto de exemplo.

Até a próxima!

Jan 7

Dica Flex – Utilizando o padrão Typesafe Enum no ActionScript 3.0

Escrito por Pablo Souza em 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Adobe, app, AR, arte, BI, blog, boolean, break, case, class, classe, classes, código, demo, Dica, Download, err, erro, error, event, events, Excel, exemplo, Flex, for, function, handle, html, ide, IE, if, image, Java, library, Livro, MXML, O, on, Oracle, padrão, problema, pt, RIA, Ria’s Geral, RoR, Segurança, spark, state, string, TAT, Teste, UAU, UI, utf8, XML @ 01 7th, 2011 | via http://rectius.com.br/blog | Sem comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Um das grandes passagens do livro Code Complete é sem dúvidas aquela que diz: “se uma linguagem não suporta nativamente uma determinada implementação, você deve então programar ‘para a linguagem’ e não ‘na linguagem’ “. O exemplo que o livro apresenta para essas limitações é justamente com relação ao Typesafe Enum, nossa dica Flex de hoje.

Os Enums são muito utilizados para evitar redundância de código e garantir o máximo de segurança nas aplicações. Além de serem excelentes objetos para se trabalhar com estados e tipos, eles também são parte essencial quando trabalhamos com o padrão de projeto State. Ele é muito utilizado também para limitar as opções de argumentos para determinados métodos. O problema é que diferente do Java 5 ou do ActionScript 2, o ActionScript 3 não suporta Enums e não permite usar o modificador privado no construtor das classes.

Suponha que temos um método que retorna a URL de uma imagem em 3 diferentes tamanhos: Pequeno, médio e grande. Para retornar o caminho dessa imagem passamos como argumento do método qual o tamanho que esperamos. Sem utilizar o Typesafe Enum poderíamos fazer conforme código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?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"
               initialize="application1_initializeHandler(event)">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            private static const PEQUENO:String     = "pequeno";
            private static const MEDIO:String     = "medio";
            private static const GRANDE:String   = "grande";

            protected function application1_initializeHandler(event:FlexEvent):void
            {
                trace( retornaCaminhoImagem("texto qualquer") );
            }

            private function retornaCaminhoImagem(tamanho:String):String
            {
                var caminho:String;
                switch(tamanho)
                {
                    case PEQUENO:
                    {
                        caminho = "http://www.suaurl.com/imagem_pequena.jpg";
                        break;
                    }
                    case MEDIO:
                    {
                        caminho = "http://www.suaurl.com/imagem_media.jpg";
                        break;
                    }
                    case GRANDE:
                    {
                        caminho = "http://www.suaurl.com/imagem_grande.jpg";
                        break;
                    }
                    default:
                    {
                        caminho = "[ERRO]";
                    }
                }

                return caminho;
            }

        ]]>
    </fx:Script>

</s:Application>

O problema no código acima é que podemos passar como argumento do método “retornaCaminhoImagem()” qualquer string:

1
trace( retornaCaminhoImagem("texto qualquer") );

Para resolvermos o problema acima vamos criar uma classe que implementa o padrão Typesafe Enum:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package enum
{
    public class ImageSizeEnum
    {

        public static const PEQUENO:ImageSizeEnum   = new ImageSizeEnum("pequeno");
        public static const MEDIO:ImageSizeEnum     = new ImageSizeEnum("medio");
        public static const GRANDE:ImageSizeEnum    = new ImageSizeEnum("grande");

        private var _tamanho:String;

        private static var _instance:Boolean = false;

        // Bloco estático
        {
            _instance = true;
        }

        public function ImageSizeEnum(tamanho:String)
        {
            if(_instance)
            {
                throw new Error("Você não pode instanciar um Typesafe Enum");
            }
            _tamanho = tamanho;
        }

        public function toString():String
        {
            return this._tamanho;
        }
    }
}

Repare no bloco estático que criamos, ele será excutado assim que a classe for carregada na memória, portanto antes do construtor da classe ser chamado e depois que todos os membros estáticos forem criados.

Agora crie um novo método chamado “retornaCaminhoTypesafeEnum()”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private function retornaCaminhoTypesafeEnum(tamanho:ImageSizeEnum):String
            {
                var caminho:String;
                switch(tamanho)
                {
                    case ImageSizeEnum.PEQUENO:
                    {
                        caminho = "http://www.suaurl.com/imagem_pequena.jpg";
                        break;
                    }
                    case ImageSizeEnum.MEDIO:
                    {
                        caminho = "http://www.suaurl.com/imagem_media.jpg";
                        break;
                    }
                    case ImageSizeEnum.GRANDE:
                    {
                        caminho = "http://www.suaurl.com/imagem_grande.jpg";
                        break;
                    }
                    default:
                    {
                        caminho = "[ERRO]";
                    }
                }

                return caminho;
            }

Para utilizá-lo faça:

1
trace( retornaCaminhoTypesafeEnum(ImageSizeEnum.GRANDE) );

Faça alguns testes, tente instanciar nosso Enum para criar um novo tipo:

1
var enum:ImageSizeEnum = new ImageSizeEnum("novo_tipo");

Como resultado você deve ter recebido um erro em tempo de execução com a mensagem: “Você não pode instanciar um Typesafe Enum”.

Agora tente passar uma string qualquer como argumento do método “retornaCaminhoTypesafeEnum()”:

1
trace( retornaCaminhoTypesafeEnum("novo_tipo") );

Você deve ter visto um erro em tempo de compilação uma vez não ser possível passar como argumento do método uma string quando ele espera o tipo “ImageSizeEnum”.

Bom galera espero que tenham gostado. Veja aqui um projeto de exemplo.

Até a próxima!

Jan 5

Dica Flex – Como criar uma classe Singleton com ActionScript 3.0

Escrito por Pablo Souza em 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Adobe, app, AR, Arquitetura, blog, class, classe, classes, código, Curso, demo, Dica, err, erro, error, event, events, exemplo, Flex, for, Formação, function, handle, ide, IE, if, image, label, library, LOB, mg, MXML, O, on, padrão, problema, problemas, Projetos, pt, rest, RIA, Ria’s Geral, RoR, singleton, spark, string, TAT, UI, XML @ 01 5th, 2011 | via http://rectius.com.br/blog | Sem comentários
Pablo Souza
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

A dica Flex de hoje demonstra a implementação de um padrão de projeto muito utilizado chamado Singleton. A sua utilização se justifica quando existe a necessidade de limitar o número de instâncias de uma classe a apenas uma e quando queremos prover acesso global à essa instância. Considere que estamos modelando uma aplicação que precisa saber o tempo todo a posição do cursor do mouse. Para obter, tratar e retornar essa informação podemos então criar uma classe de gerenciamento que implementa o padrão Singleton, uma vez que existe apenas um cursor do mouse.

(mais…)

Dez 30

Retrospectiva 2010

Escrito por Fabio da Silva em 1, 2.0, 4, 6, action, Actionscript, ActionScript 3, Adobe, Adobe Flex, Air, AIR 2.0, Animações, AR, as3, BI, blog, Blogs, consultoria, control, cs4, Desenvolvedor, Desenvolvimento, e-genial, egenial, empresas, Engnatv, eval, Feevale, flash, Flex, Flex 3, Flex 4, for, framework, Google, Hibernate, html, IE, int, Java, jogo, Jogos, JPA, mg, mysql, O, on, online, Outros, PHP, produtividade, produto, prototipação, pt, rest, RIA, Ria’s Geral, site, Software, Swiz Framework, Tecnologia, Treinamento, treinamentos, tv, UI, UX, Ved, web @ 12 30th, 2010 | via http://fabiophx.blogspot.com | Sem comentários
Fabio da Silva
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

Além dos treinamentos de AS3 com Flash e Adobe Flex (3 e 4) na Alfamídia e Adobe Flex (3 e 4) na TargetTrust este ano de 2010 trouxe inúmeras oportunidades e desafios profissionais.

Alguns treinamentos in company:
  • Animações com ActionScript 3 no Flash CS4 para professores e alunos do projeto Engnatv na faculdade Feevale. Mais detalhes aqui.
  • Flex 3 e 4 na Azul Tecnologia em Fortaleza – CE. Mais detalhes aqui.
  • Flex 4 para a Braskem na Alfamídia.
  • Flex 4 na BSInfo em Bento Gonçalves – RS.
  • Convite do Igor Costa para um treinamento de Flex 4 em Florianópolis – SC como instrutor substituto da RIACycle.

Também fiz alguns treinamentos:

  • AIR 2.0 Essencial pela RIACycle ministrado pelo Igor Costa.
  • Planejamento, Prototipação e Execução de um projeto Flex/Swiz Framework e PHP/MySQL online pela e-Genial ministrado pelo Fábio Vedovelli.
  • PHP 5 e Produtividade em Java com JPA e Hibernate na TargetTrust.

Entre outros:

  • Lançamento do Flex 4 e o seu uso na Sadig na nova geração de produtos.
  • Convite da Gabriela para substituí-la em algumas cadeiras de AS3 para jogos que ela ministra na faculdade Feevale.

E neste mês de dezembro aceitei um novo desafio, o de prestar consultoria e desenvolvimento (PHP e Flex) na Ouro Moderno, empresa desenvolvedora de treinamentos interativos e também de software para empresas de treinamento para controlar alunos e treinamentos realizados.

A todos os envolvidos meus sinceros agradecimentos.

E deixo também aqui o meu desejo de um Feliz e Próspero 2011 para todos.

Que venha novos desafios.

Dez 11

Usando a classe ObjectUtil no Adobe Flex

Escrito por Leonardo França em .NET, 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Adobe, Adobe Air, Adobe Flex, api, Aplicativos, app, AR, BI, boolean, class, classe, comparação, custom, Desenvolvimento, Download, event, events, exemplo, Exemplos, flash, Flash Platform, Flex, for, framework, function, fundo, gc, handle, html, IE, if, image, int, label, library, mg, MXML, NaN, Number, O, on, Outros, PHP, platform, player, print, pt, reference, RIA, Ria’s Geral, spark, string, strings, TextInput, UI, utils, Widget, XML @ 12 11th, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



O Adobe Flex[bb] é um framework feito para criação de aplicativos RIA com a Flash Platform e que pela sua facilidade vem se tornando muito popular nos ultimos anos. Há classe chamada ObjectUtil, uma classe estática com uma serie de métodos para ajudar e agilizar no desenvolvimento de suas aplicações. Vou mostrar alguns exemplos dos métodos que mais utilizo.

numericCompare é um método usado para comparar dois números, retorna 0 se os dois são nulos ou iguais, 1 se o primeiro parametro for maior que o segundo e -1 se o segundo parametro for maior que o primeiro. Veja um exemplo:

PLAIN TEXT
MXML:

  1. “1.0″ encoding=“utf-8″?>
  2. xmlns:fx=“http://ns.adobe.com/mxml/2009″
  3. ? ? ? ? ? ? ? ?xmlns:s=“library://ns.adobe.com/flex/spark”
  4. ? ? ? ? ? ? ? ?xmlns:mx=“library://ns.adobe.com/flex/mx” minWidth=“955″ minHeight=“600″>
  5. ? ? >
  6. ? ? ? ?
  7. ? ? >
  8. ? ? >
  9. ? ? ? ? [CDATA[
  10. ? ? ? ? ? ? import mx.utils.ObjectUtil;
  11. ? ? ? ? ? ?
  12. ? ? ? ? ? ? private function isNumbersEqual(number1:Number,number2:Number):Boolean
  13. ? ? ? ? ? ? {
  14. ? ? ? ? ? ? ? ? var retorno:Boolean = false;
  15. ? ? ? ? ? ? ? ? var isEqual:int = ObjectUtil.numericCompare(number1,number2);
  16. ? ? ? ? ? ? ? ? if(isEqual == 0)
  17. ? ? ? ? ? ? ? ? {
  18. ? ? ? ? ? ? ? ? ? ? retorno = true;
  19. ? ? ? ? ? ? ? ? }
  20. ? ? ? ? ? ? ? ? return retorno;
  21. ? ? ? ? ? ? }
  22. ?
  23. ? ? ? ? ? ? protected function button1_clickHandler(event:MouseEvent):void
  24. ? ? ? ? ? ? {
  25. ? ? ? ? ? ? ? ? if(isNumbersEqual(Number(t1.text),Number(t2.text)))
  26. ? ? ? ? ? ? ? ? {
  27. ? ? ? ? ? ? ? ? ? ? lb.text = "Numbers are equals!";
  28. ? ? ? ? ? ? ? ? }
  29. ? ? ? ? ? ? ? ? else
  30. ? ? ? ? ? ? ? ? {
  31. ? ? ? ? ? ? ? ? ? ? lb.text = "Numbers are not equals!";
  32. ? ? ? ? ? ? ? ? }
  33. ? ? ? ? ? ? }
  34. ? ? ? ? ]]>
  35. ? ? >
  36. ? ? id=“t1″ x=“10″ y=“10″/>
  37. ? ? id=“t2″ x=“146″ y=“10″/>
  38. ? ? x=“282″ y=“10″ label=“Compare” click=“button1_clickHandler(event)”/>
  39. ? ? id=“lb” x=“363″ y=“19″/>
  40. >

compare é um método usado para comparar dois objetos. Ele usa um algoritimo para ir o mais profundo possivel no objeto e suas propriedades. Veja um exemplo:

PLAIN TEXT
MXML:

  1. “1.0″ encoding=“utf-8″?>
  2. xmlns:fx=“http://ns.adobe.com/mxml/2009″
  3. ? ? ? ? ? ? ? ?xmlns:s=“library://ns.adobe.com/flex/spark”
  4. ? ? ? ? ? ? ? ?xmlns:mx=“library://ns.adobe.com/flex/mx” minWidth=“955″ minHeight=“600″ creationComplete=“application1_creationCompleteHandler(event)”>
  5. ? ? >
  6. ? ? ? ?
  7. ? ? >
  8. ? ? >
  9. ? ? ? ? [CDATA[
  10. ? ? ? ? ? ? import mx.events.FlexEvent;
  11. ? ? ? ? ? ? import mx.utils.ObjectUtil;
  12. ? ? ? ? ? ?
  13. ? ? ? ? ? ? private function isObjectEqual(obj1:Object,obj2:Object):Boolean
  14. ? ? ? ? ? ? {
  15. ? ? ? ? ? ? ? ? var retorno:Boolean = false;
  16. ? ? ? ? ? ? ? ? var isEqual:int = ObjectUtil.compare(obj1,obj2);
  17. ? ? ? ? ? ? ? ? if(isEqual == 0)
  18. ? ? ? ? ? ? ? ? {
  19. ? ? ? ? ? ? ? ? ? ? retorno = true;
  20. ? ? ? ? ? ? ? ? }
  21. ? ? ? ? ? ? ? ? return retorno;
  22. ? ? ? ? ? ? }
  23. ? ? ? ? ? ?
  24. ? ? ? ? ? ? protected function application1_creationCompleteHandler(event:FlexEvent):void
  25. ? ? ? ? ? ? {
  26. ? ? ? ? ? ? ? ? var a:Object = {name:"Leo", info:[1,2,3]};
  27. ? ? ? ? ? ? ? ? var b:Object = {name:“Leo”, info:[1,2,2]};
  28. ? ? ? ? ? ? ? ? if(isObjectEqual(a,b))
  29. ? ? ? ? ? ? ? ? {
  30. ? ? ? ? ? ? ? ? ? ? lb.text = “Objects are equals!”;
  31. ? ? ? ? ? ? ? ? }
  32. ? ? ? ? ? ? ? ? else
  33. ? ? ? ? ? ? ? ? {
  34. ? ? ? ? ? ? ? ? ? ? lb.text = “Objects are not equals!”;
  35. ? ? ? ? ? ? ? ? }
  36. ? ? ? ? ? ? }
  37. ? ? ? ? ]]>
  38. ? ? >
  39. ? ? id=“lb” x=“0″ y=“19″/>
  40. >

dateCompare Trabalhar com datas sempre gera um pouco de trabalho, pois você sempre tem que fazer uma serie de verificações, modificar formatos etc. Temos um método para comparação de datas que pode ser muito util e agilizar seu trabalho. Segue o mesmo esquema dos demais, retorna 0 se datas iguais, 1 se a primeira é maior que a segunda e -1 se a segunda é maior que a primeira. Veja um exemplo:

PLAIN TEXT
MXML:

  1. “1.0″ encoding=“utf-8″?>
  2. xmlns:fx=“http://ns.adobe.com/mxml/2009″
  3. ? ? ? ? ? ? ? ?xmlns:s=“library://ns.adobe.com/flex/spark”
  4. ? ? ? ? ? ? ? ?xmlns:mx=“library://ns.adobe.com/flex/mx” minWidth=“955″ minHeight=“600″>
  5. ? ? >
  6. ? ? ? ?
  7. ? ? >
  8. ? ? >
  9. ? ? ? ? [CDATA[
  10. ? ? ? ? ? ? import mx.utils.ObjectUtil;
  11. ? ? ? ? ? ?
  12. ? ? ? ? ? ? private function isDateEqual(dt1:Date,dt2:Date):Boolean
  13. ? ? ? ? ? ? {
  14. ? ? ? ? ? ? ? ? var retorno:Boolean = false;
  15. ? ? ? ? ? ? ? ? var isEqual:int = ObjectUtil.dateCompare(dt1,dt2);
  16. ? ? ? ? ? ? ? ? if(isEqual == 0)
  17. ? ? ? ? ? ? ? ? {
  18. ? ? ? ? ? ? ? ? ? ? retorno = true;
  19. ? ? ? ? ? ? ? ? }
  20. ? ? ? ? ? ? ? ? return retorno;
  21. ? ? ? ? ? ? }
  22. ?
  23. ? ? ? ? ? ? protected function button1_clickHandler(event:MouseEvent):void
  24. ? ? ? ? ? ? {
  25. ? ? ? ? ? ? ? ? if(isDateEqual(dt1.selectedDate,dt2.selectedDate))
  26. ? ? ? ? ? ? ? ? {
  27. ? ? ? ? ? ? ? ? ? ? lb.text = "Date are equals!";
  28. ? ? ? ? ? ? ? ? }
  29. ? ? ? ? ? ? ? ? else
  30. ? ? ? ? ? ? ? ? {
  31. ? ? ? ? ? ? ? ? ? ? lb.text = "Date are not equals!";
  32. ? ? ? ? ? ? ? ? }
  33. ? ? ? ? ? ? }
  34. ? ? ? ? ]]>
  35. ? ? >
  36. ? ? id=“dt1″ x=“10″ y=“10″/>
  37. ? ? id=“dt2″ x=“113″ y=“10″/>
  38. ? ? x=“216″ y=“12″ label=“Compare” click=“button1_clickHandler(event)”/>
  39. ? ? id=“lb” x=“297″ y=“21″/>
  40. >

stringCompare é usado para comparar duas strings, um detalhe é que existe um terceiro parametro boolean para dizer se a comparação sera feita diferenciando letras maiusculas de minusculas ou não. Veja um exemplo:

PLAIN TEXT
MXML:

  1. “1.0″ encoding=“utf-8″?>
  2. xmlns:fx=“http://ns.adobe.com/mxml/2009″
  3. ? ? ? ? ? ? ? ?xmlns:s=“library://ns.adobe.com/flex/spark”
  4. ? ? ? ? ? ? ? ?xmlns:mx=“library://ns.adobe.com/flex/mx” minWidth=“955″ minHeight=“600″>
  5. ? ? >
  6. ? ? ? ?
  7. ? ? >
  8. ? ? >
  9. ? ? ? ? [CDATA[
  10. ? ? ? ? ? ? import mx.utils.ObjectUtil;
  11. ? ? ? ? ? ?
  12. ? ? ? ? ? ? private function isStringsEqual(str1:String,str2:String):Boolean
  13. ? ? ? ? ? ? {
  14. ? ? ? ? ? ? ? ? var retorno:Boolean = false;
  15. ? ? ? ? ? ? ? ? var isEqual:int = ObjectUtil.stringCompare(str1,str2,true);
  16. ? ? ? ? ? ? ? ? if(isEqual == 0)
  17. ? ? ? ? ? ? ? ? {
  18. ? ? ? ? ? ? ? ? ? ? retorno = true;
  19. ? ? ? ? ? ? ? ? }
  20. ? ? ? ? ? ? ? ? return retorno;
  21. ? ? ? ? ? ? }
  22. ?
  23. ? ? ? ? ? ? protected function button1_clickHandler(event:MouseEvent):void
  24. ? ? ? ? ? ? {
  25. ? ? ? ? ? ? ? ? if(isStringsEqual(t1.text,t2.text))
  26. ? ? ? ? ? ? ? ? {
  27. ? ? ? ? ? ? ? ? ? ? lb.text = "Strings are equals!";
  28. ? ? ? ? ? ? ? ? }
  29. ? ? ? ? ? ? ? ? else
  30. ? ? ? ? ? ? ? ? {
  31. ? ? ? ? ? ? ? ? ? ? lb.text = "Strings are not equals!";
  32. ? ? ? ? ? ? ? ? }
  33. ? ? ? ? ? ? }
  34. ? ? ? ? ]]>
  35. ? ? >
  36. ? ? id=“t1″ x=“10″ y=“10″/>
  37. ? ? id=“t2″ x=“146″ y=“10″/>
  38. ? ? x=“282″ y=“10″ label=“Compare” click=“button1_clickHandler(event)”/>
  39. ? ? id=“lb” x=“363″ y=“19″/>
  40. >

toString funciona mais ou menos como o print_r do PHP, torna legivel um objeto e toda sua estrutura hierarquica. Veja um exemplo:

PLAIN TEXT
MXML:

  1. “1.0″ encoding=“utf-8″?>
  2. xmlns:fx=“http://ns.adobe.com/mxml/2009″
  3. ? ? ? ? ? ? ? ?xmlns:s=“library://ns.adobe.com/flex/spark”
  4. ? ? ? ? ? ? ? ?xmlns:mx=“library://ns.adobe.com/flex/mx” minWidth=“955″ minHeight=“600″ creationComplete=“application1_creationCompleteHandler(event)”>
  5. ? ? >
  6. ? ? ? ?
  7. ? ? >
  8. ? ? >
  9. ? ? ? ? [CDATA[
  10. ? ? ? ? ? ? import mx.events.FlexEvent;
  11. ? ? ? ? ? ? import mx.utils.ObjectUtil;
  12. ?
  13. ? ? ? ? ? ? protected function application1_creationCompleteHandler(event:FlexEvent):void
  14. ? ? ? ? ? ? {
  15. ? ? ? ? ? ? ? ? var a:Object = {name:"Bob", info:[1,2,3]};
  16. ? ? ? ? ? ? ? ? var b:Object = {name:“Alice”, info:a};
  17. ? ? ? ? ? ? ? ? trace(b);
  18. ? ? ? ? ? ? ? ? trace(ObjectUtil.toString(b));
  19. ? ? ? ? ? ? ? ? //output in console
  20. ? ? ? ? ? ? ? ? /*
  21. ? ? ? ? ? ? ? ? first trace
  22. ? ? ? ? ? ? ? ? [object Object]
  23. ? ? ? ? ? ? ? ?
  24. ? ? ? ? ? ? ? ? second trace
  25. ? ? ? ? ? ? ? ? (Object)#0
  26. ? ? ? ? ? ? ? ? info = (Object)#1
  27. ? ? ? ? ? ? ? ? info = (Array)#2
  28. ? ? ? ? ? ? ? ? [0] 1
  29. ? ? ? ? ? ? ? ? [1] 2
  30. ? ? ? ? ? ? ? ? [2] 3
  31. ? ? ? ? ? ? ? ? name = “Bob”
  32. ? ? ? ? ? ? ? ? name = “Alice”
  33. ? ? ? ? ? ? ? ? */
  34. ? ? ? ? ? ? }
  35. ? ? ? ? ]]>
  36. ? ? >
  37. >

copy é usado para fazer uma cópia de um objeto usando um algoritimo de serialização nativa do Flash. Player. Muito útil para se trabalhar com objetos customizados e coleções.

DOWNLOAD SOURCE

Veja outros métodos:
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/ObjectUtil.html
ActionScript 3.0 Reference for the Adobe Flash Platform

Dez 6

Como salvar “ SnapShots” de componentes do Flex na máquina do usuário.

Escrito por DClick Team em 1, 4, 6, action, Actionscript, ActionScript 3, api, Aplicativos, AR, arte, as3, back, BI, bitmap, blog, class, Componente, Componentes, Curso, Cursos, dados, desempenho, encode, encoder, event, exemplo, flash, Flash Player, Flex, for, function, game, git, handle, ide, IE, if, image, int, label, library, map, mg, Motivação, NaN, News, O, Office, on, Outros, padrão, Partilha, player, processo, pt, reference, referencia, RIA, Ria’s Geral, Sem categoria, servidor, TAT, Tutorial, Twitter, UI @ 12 6th, 2010 | via http://blog.dclick.com.br/pt/ | Sem comentários
DClick Team
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

https://github.com/mikechambers/as3corelib .

Implementação

Então vamos ao que interessa. Esta pequena função abaixo é que faz toda a mágica, é ela que gera a imagem a partir do componente AgonNewsSnapShot e o salva na maquina do usuário:

PLAIN TEXT
ACTIONSCRIPT:

  1. protected function saveSnapshot_clickHandler(event:MouseEvent):void
  2. {
  3. var imageBitmapData:BitmapData = ImageSnapshot.captureBitmapData(birthDaySnapshot);
  4. var imgByteData:ByteArray = PNGEncoder.encode(imageBitmapData);
  5. var file:FileReference = new FileReference();
  6. file.save(imgByteData,“nomeDoArquivo.png”);
  7. }

O componente AgonNewsSnapShot nada mais é do que um Group no qual todos os seus filhos (Labels, Background, Images, etc.) serão desenhados na imagem a ser salva, veja abaixo o exemplo de uma instância deste componente:

Vamos dividir em partes:

Primeiro é capturada a imagem Bitmap do componente AgonNewsSnapShot, que no nosso caso é o componente que será salvo como imagem no computador do usuário:

PLAIN TEXT
ACTIONSCRIPT:

  1. var imageBitmapData:BitmapData = ImageSnapshot.captureBitmapData(agonNewsSnapshot);

Usamos o PNGEncoder para converter a imagem e retornar o ByteArray da mesma:

PLAIN TEXT
ACTIONSCRIPT:

  1. var imgByteData:ByteArray = PNGEncoder.encode(imageBitmapData);

É chamado o system dialog padrão do S.O, para salvar o ByteArray na maquina do usuário no diretório selecionado por ele.

PLAIN TEXT
ACTIONSCRIPT:

  1. var file:FileReference = new FileReference();
  2. file.save(imgByteData,“nomeDoArquivo.png”);

Pronto! Seu componente acaba de ser desenhado numa imagem e salvo no computador do usuário.

Bom galera esse é meu primeiro post, espero que tenham gostado, e virão mais por aí.

Abraços.

Referencias:

http://www.switchonthecode.com/tutorials/flex-tutorial-an-asynchronous-jpeg-encoder

http://ask.amoeba.co.in/save-images-from-flash-actionsctipt-3-filereference-save-jpgencoder/


Nov 9

Flex 4, variáveis e atributos

Escrito por Mauro Martins em .NET, 1, 4, 6, Access, action, Actionscript, ActionScript 3, Actionscript 3.0, Adobe, AR, BI, blog, class, classe, classes, código, Componente, Componentes, demo, Documentação, exemplo, flash, Flash / Flex, Flex, Flex 4, Flex4, for, Formação, gc, html, IE, if, image, int, map, mg, O, on, platform, pt, reference, rest, RIA, Ria’s Geral, site, state, string, Sun, TAT, Tema, UI @ 11 9th, 2010 | via http://imauro.com/blog/ | Sem comentários
Mauro Martins
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »

flex4 Flex 4, variáveis e atributosactionscripticon 400 300x300 Flex 4, variáveis e atributos

Por vezes, quando estamos sobre pressão, ou menos atentos, esquecemos-nos, ou temos dificuldade em nos lembrarmos das coisas mais básicas.

No caso deste post, venho falar sobre o que representam certos atributos das variáveis que utilizamos no Flex 4 / ActionScript 3.0. Isto é um tema muito importante e temos de ter estes atributos sempre em conta se queremos ter as nossas variáveis acessíveis a classes dentro dos nossos packages ou se queremos restringir as mesmas a só poderem ser acedidas num determinado scope.

Sendo assim, aqui vai uma pequena descrição dos tipos de “accessors” que temos à nossa disposição  no Flex 4.

public - Este tipo de atributo faz com que a nossa variável possa ser acedida por qualquer outra classe desde que faça referência à classe que a declara.

Exemplo – Se tivermos uma classe que queira fazer referência a uma variável estática que existe em outra classe, podemos utilizar:

var myString : String = MyEnumClass.MY_VARIABLE;

No caso de querermos aceder a uma variável dentro da classe que pode ir mudando ao longo do tempo (normalmente utilizado quando temos componentes criados por nós no Flex 4):

var mySecondString : String = myClass.myVariable;

private - Este atributo da variável diz-nos que a mesma só pode ser acedida dentro da mesma classe.

Exemplo – Definimos uma variável como private na nossa classe e acedemos à mesma.

private var myVariable : String = “MyVar”;

trace (myVariable);

protected - Este atributo diz-nos que a nossa variável só pode ser acedida pela mesma classe que a cria, por todas as que fazem extends dela.

Exemplo – Definimos uma variável protected numa classse que servirá de base e depois usamo-la na nossa classe que faz extends:

Classe 1 (BaseClass):

protected var myString : String = “myString”;

Classe 2:

Classe2 extends BaseClass

trace(myString);

internal - Este tipo de atributo define a nossa variável como podendo ser acedida pela própria classe que a criar e também por qualquer das classes que se encontram dentro do mesmo package.

Se tentarmos representar as diferentes possibilidades dos atributos das variáveis, cruzando-as com o sítio onde as declaramos, podemos ter uma representação gráfica de mais fácil compreensão.

Podem ver a implementação destes accessors nesta tabela:

Code placement Private Internal Protected Public
Same class Allow Allow Allow Allow
Descendants of class Deny Allow Allow Allow
Classes in same package Deny Allow Deny Allow
Other package Deny Deny Deny Allow

Conclusão:

Como podemos ver, se quisermos ter o nosso código muito bem estruturado e os nossos componentes muito bem definidos, temos sempre de ter em conta os atributos que damos às nossas variáveis. Isto porque, a simples definição de uma variável, pode fazer com que estraguem a nossa implementação da classe que pensamos que já estaria bem implementada. Convém sempre perder um certo tempo a pensar, definir, e estruturar todas as variáveis dentro do nosso código! Valem sempre a pena icon smile Flex 4, variáveis e atributos

Esta tabela e mais informação sobre o assunto podem ser encontradas no site da FLEX{er}.

Podem também ler sobre todos os tipos de variáveis no ActionScript 3.0, aqui , na documentação da Adobe.



Nov 2

Adobe Flash com novas APIs 3D – Conheça o Molehill

Escrito por Leonardo França em 1, 3d, 4, 6, Access, action, Actionscript, ActionScript 3, Actionscript 3.0, Adobe, Adobe Air, Adobe Max, api, app, AR, BI, class, control, Controles, custom, demo, flash, Flash Player, for, FullScreen, ide, IE, if, image, Java, Javascript, mg, NaN, O, on, PHP, player, pt, Review, Ria’s Geral, screen, swf, tv, wave, Widget, Widgets @ 11 2nd, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Foi apresentado no Adobe MAX 2010 ocorrido no final de outubro um preview do Adobe Flash Player 11 com novas APIs para se trabalhar com 3D – codinome Molehill – o resultado é impressionante e podemos ver também o suporte do novo Flash Player aos controles dos consoles, no video é usado um volante do X-Box.




Out 18

Upload de arquivos com Adobe Flex e Zend AMF

Escrito por Leonardo França em .NET, 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Actionscript3, Adobe, Adobe Flex, AMF, apache, api, app, AR, arte, Artigo, back, bar, BI, Bindable, boolean, carregar, catch, class, classe, comunicação, control, Controls, custom, Download, err, erro, error, event, EventListener, events, filter, flash, Flex, for, framework, function, Google, handle, html, ide, IE, if, image, int, Java, Javascript, label, library, lite, live, map, mg, MXML, O, on, PHP, procura, progress, pt, reference, Remoting, Ria’s Geral, RoR, server, spark, string, Tema, Teste, TextInput, try, UI, utils, Ved, Widget, Widgets, Wordpress, XML, XP, zend, Zend Amf, zendAMF, zendFramework @ 10 18th, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



O Zend AMF é uma implementação feita em PHP[bb]para se trabalhar com o protocolo de comunicação binário AMF(Action Message Format) fazendo parte do ZendFramework. Precisei implementar um sistema de upload de arquivos que fosse um pouco diferente do que normalmente é usado no Adobe Flash, sendo que essa funcionalidade precisava ser integrada no Zend AMF.

Pesquisando um pouco na net, achei a solução que foi mais simples do que eu imaginava baseada nesse artigo com algumas poucas adaptações.

Começaremos pelo nosso gateway que será usado como endpoint no Adobe Flex.

PLAIN TEXT
PHP:

  1. <?php
  2. require_once ‘Zend/Amf/Server.php’;
  3. require_once ‘Zend/Amf/Exception.php’;
  4. require_once ‘br/com/leonardofranca/vo/FileVO.php’;
  5. require_once ‘br/com/leonardofranca/UploadZendAMF.php’;
  6.  
  7. $server = new Zend_Amf_Server();
  8. $server->setProduction(false);
  9.  
  10. $server->setClass(‘UploadZendAMF’);
  11.  
  12. $server->setClassMap(‘FileVO’,"br.com.leonardofranca.vo.FileVO");
  13.  
  14. echo($server->handle());
  15. ?>

Agora o nosso VO com propriedades com nome do arquivo e os binarios.

PLAIN TEXT
PHP:

  1. <?php
  2. class FileVO
  3. {
  4.     public $_explicitType = ‘br.com.leonardofranca.vo.FileVO’;
  5.     public $fileName;
  6.     public $fileData;
  7.    
  8.     function __construct ()
  9.     {}
  10.    
  11.     public function getFileName()
  12.     {
  13.         return $this->fileName;
  14.     }
  15.  
  16.     public function setFileName($fileName)
  17.     {
  18.         $this->fileName = $fileName;
  19.     }
  20.  
  21.     public function getFileData()
  22.     {
  23.         return $this->fileData;
  24.     }
  25.  
  26.     public function setFileData($fileData)
  27.     {
  28.         $this->fileData = $fileData;
  29.     }
  30. }
  31. ?>

Agora nossa classe PHP que ser responsavél por efetudar o upload.

PLAIN TEXT
PHP:

  1. <?php
  2. class UploadZendAMF  
  3. {
  4.     public function __construct()
  5.     {
  6.      
  7.     }
  8.    
  9.     public function upload(FileVO $data)
  10.     {
  11.         try
  12.         {
  13.             $fileData = $data->getFileData();
  14.             file_put_contents( ‘C:\apache\htdocs\images\’ . $data->getFileName(), $fileData);
  15.             return true;   
  16.         }
  17.         catch (Exception $e)
  18.         {
  19.             throw new Exception($e->getMessage());
  20.         }
  21.     }
  22. }
  23. ?>

Agora vamos a camada de visão usando o Adobe Flex, começamos com nosso VO.

PLAIN TEXT
ACTIONSCRIPT3:

  1. package br.com.leonardofranca.vo
  2. {
  3.     import flash.utils.ByteArray;
  4.  
  5.     [Bindable]
  6.     [RemoteClass(alias="br.com.leonardofranca.vo.FileVO")]
  7.     public class FileVO
  8.     {
  9.         private var _fileName:String;
  10.         private var _fileData:ByteArray;
  11.        
  12.         public function FileVO()
  13.         {
  14.         }
  15.  
  16.         public function get fileName():String
  17.         {
  18.             return _fileName;
  19.         }
  20.  
  21.         public function set fileName(value:String):void
  22.         {
  23.             _fileName = value;
  24.         }
  25.  
  26.         public function get fileData():ByteArray
  27.         {
  28.             return _fileData;
  29.         }
  30.  
  31.         public function set fileData(value:ByteArray):void
  32.         {
  33.             _fileData = value;
  34.         }
  35.  
  36.     }
  37. }

Agora nosso mxml que carregará os bytes do arquivo para enviar para o Zend AMF.

PLAIN TEXT
MXML:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
  3.                xmlns:s="library://ns.adobe.com/flex/spark"
  4.                xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)">
  5.     <fx:Declarations>
  6.         <!– Place non-visual elements (e.g., services, value objects) here –>
  7.     </fx:Declarations>
  8.     <fx:Script>
  9.         <![CDATA[
  10.             import br.com.leonardofranca.vo.FileVO;
  11.            
  12.             import mx.controls.Alert;
  13.             import mx.events.FlexEvent;
  14.             import mx.rpc.events.FaultEvent;
  15.             import mx.rpc.events.ResultEvent;
  16.             import mx.rpc.remoting.mxml.RemoteObject;
  17.             import mx.utils.ObjectUtil;
  18.            
  19.             private var ro:RemoteObject;
  20.             private var fileRef:FileReference;
  21.             private var fileTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg)", "*.jpg; *.jpeg");
  22.             private var allTypes:Array = new Array(fileTypes);
  23.  
  24.            
  25.             protected function application1_creationCompleteHandler(event:FlexEvent):void
  26.             {
  27.                 ro = new RemoteObject();
  28.                 ro.destination = "nao faz diferença nenhuma usando com Zend AMF";
  29.                 ro.endpoint = "http://localhost:81/ZendAmf/teste_upload.php";
  30.                 ro.source = "br.com.leonardofranca.UploadZendAMF";
  31.                 ro.addEventListener(ResultEvent.RESULT, handlerResult);
  32.                 ro.addEventListener(FaultEvent.FAULT, handlerFault);
  33.                
  34.                 btnProcurar.addEventListener(MouseEvent.CLICK, handlerUpload);
  35.                 btnSend.addEventListener(MouseEvent.CLICK, uploadVideos);
  36.             }
  37.            
  38.             protected function handlerUpload(evt:MouseEvent=null):void
  39.             {
  40.                 fileRef = new FileReference();
  41.                 fileRef.addEventListener(Event.SELECT,selectHandler);
  42.                 //          fileRef.addEventListener(Event.COMPLETE,completeHandler);
  43.                 //          fileRef.addEventListener(ProgressEvent.PROGRESS,progressHandler);
  44.                 fileRef.browse(allTypes);
  45.             }
  46.            
  47.             protected function selectHandler(evt:Event):void
  48.             {
  49.                 txtFile.text = fileRef.name;
  50.                 fileRef.load();
  51.             }
  52.            
  53.             protected function uploadVideos(evt:MouseEvent=null):void
  54.             {
  55.                 var data:ByteArray = new ByteArray();
  56.                 fileRef.data.readBytes(data,0,fileRef.data.length);
  57.                
  58.                 var vo:FileVO = new FileVO();
  59.                 vo.fileName = fileRef.name;
  60.                 vo.fileData = data;
  61.                
  62.                 ro.upload(vo);
  63.             }
  64.            
  65.             protected function handlerResult(re:ResultEvent):void
  66.             {
  67.                 trace(ObjectUtil.toString(re.message.body));
  68.                 if(Boolean(re.message.body))
  69.                 {
  70.                     Alert.show("Arquivo enviado com sucesso!","Sucesso!");
  71.                 }
  72.                 else
  73.                 {
  74.                     Alert.show("Não foi possivel enviar o arquivo!","Error!");
  75.                 }
  76.             }
  77.            
  78.             protected function handlerFault(fault:FaultEvent):void
  79.             {
  80.                 Alert.show(fault.fault.faultString,"Error!");
  81.             }
  82.            
  83.         ]]>
  84.     </fx:Script>
  85.     <mx:Form>
  86.         <mx:FormItem label="Envio de arquivos" direction="horizontal">
  87.             <s:TextInput id="txtFile"/>
  88.             <s:Button id="btnProcurar" label="Procurar"/>
  89.             <s:Button id="btnSend" label="Enviar"/>
  90.         </mx:FormItem>
  91.     </mx:Form>
  92. </s:Application>

DOWNLOAD SOURCE




Out 15

Usando Acelerômetro no Flash Lite 4.0

Escrito por Leonardo França em 1, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Actionscript3, Adobe, api, Aplicativos, AR, back, bar, BI, bitmap, browser, cache, camp, class, classe, classes, código, Curso, Cursos, custom, dados, Desenvolvimento, Download, Draw, efeito, efeitos, engine, err, event, EventListener, exemplo, filter, flash, flash lite, Flash Player, Flex, for, function, geo, Google, handle, html, IE, if, image, int, Java, Javascript, lite, live, map, mg, Number, O, on, PHP, player, pt, rest, RIA, Ria’s Geral, RTM, RTMP, streaming, string, tag, Tema, Touch, UI, update, Ved, Widget, Widgets @ 10 15th, 2010 | via http://www.leonardofranca.com.br | Sem comentários
Leonardo França
? X
  • Bookmarks

Blinkbits BlinkLists BlogLines Blogmarks Buddymarks CiteULike Co.mments Del.icio.us Digg Diigo

Fark Feed Me Links Furl Google Linkagogo ma.gnolia Mister Wong Newsvine Propeller Rawsugar

Reddit Rojo Simpy Sphinn Spurl Squidoo StumbleUpon Tailrank Technorati Yahoo

More »



Tivemos o lançamento do Nokia N8, o primeiro dispositivo oficialmente a suportar Flash Lite 4.0. Além do Nokia N8[bb], também temos o Nokia C7[bb] e o Nokia E7[bb], todos rodando o sistema operacional Symbian^3 e com o Adobe Flash Lite 4.0 já instalado. Isso implica a possibilidade do desenvolvimento de aplicativos para Symbian^3 usando ActionScript 3.0 rodando pelo browser ou standalone.
Precisamos atentar para o fato de que o Flash Lite 4.0 não é o Flash Player 10.1, eles possuem algumas diferenças significativas:

  • Flash Lite suporta algumas funcionalidades parcialmente.
  • Flash Lite adiciona algumas funcionalidades para trabalhar especificamente com dispositivos movéis.

O Flash Lite 4.0 é baseado no Flash Player 10, possuindo recursos que foram introduzido no Flash Player 9 e 10. Entre os recursos disponivéis estão:

  • Multi-touch support
  • Flash Player 10 text engine
  • Using inline text input
  • RTMP data channel
  • RTMPE
  • RTMPT and RTMPTE
  • Multi bit-rate streaming
  • Geolocation
  • Accelerometer
  • SharedObject Remote(Obaaaa! :D )

Além disso veja as classes parcialmente suportadas e as classes não suportadas.
Vamos ao nosso primeiro exemplo com utilização das novas capacidades do Flash Lite 4.0, nesse caso, acelerômetro.

  • Crie um arquivo do tipo Flash Lite 4.0 pelo Flash CS5 ou pelo Adobe Device Central CS5.
  • Adicione três campos de textos dinâmicos, neles serão mostrados as coordenadas de x, y e z.

Começaremos nossa codificação, teremos um método para criar a bola que sofrerá os efeitos do acelerômetro

PLAIN TEXT
ACTIONSCRIPT3:

  1. function createBall():void
  2. {
  3.     ball = new Sprite();
  4.     ball.graphics.beginFill(0xFF0000);
  5.     ball.graphics.drawCircle(0, 0, RADIUS);
  6.     ball.cacheAsBitmap = true;
  7.     ball.x = stage.stageWidth / 2;
  8.     ball.y = stage.stageHeight / 2;
  9.     addChild(ball);
  10. }

Em seguida, verificamos se o aparelho tem acelerômetro para adicionarmos os listeners que pega os dados do sensor e para atualizar as posições da bola.

PLAIN TEXT
ACTIONSCRIPT3:

  1. function AccelerometerTest()
  2. {
  3.     stage.scaleMode = StageScaleMode.NO_SCALE;
  4.     stage.align = StageAlign.TOP_LEFT;
  5.  
  6.     createBall();
  7.  
  8.     if (Accelerometer.isSupported)
  9.     {
  10.         accelerometer = new Accelerometer();
  11.         accelerometer.addEventListener(AccelerometerEvent.UPDATE, accUpdateHandler);
  12.         stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  13.     }
  14. }

E o restante do código.

PLAIN TEXT
ACTIONSCRIPT3:

  1. function enterFrameHandler(event:Event):void
  2. {
  3.     event.stopPropagation();
  4.     moveBall();
  5. }
  6. function moveBall():void
  7. {
  8.     var newX:Number = ball.x + xSpeed;
  9.     var newY:Number = ball.y + ySpeed;
  10.     if (newX <20)
  11.     {
  12.         ball.x = RADIUS;
  13.         xSpeed = 0;
  14.     }
  15.     else if (newX> stage.stageWidth - RADIUS)
  16.     {
  17.         ball.x = stage.stageWidth - RADIUS;
  18.         xSpeed = 0;
  19.     }
  20.     else
  21.     {
  22.         ball.x +=  xSpeed;
  23.     }
  24.  
  25.     if (newY <RADIUS)
  26.     {
  27.         ball.y = RADIUS;
  28.         ySpeed = 0;
  29.     }
  30.     else if (newY> stage.stageHeight - RADIUS)
  31.     {
  32.         ball.y = stage.stageHeight - RADIUS;
  33.         ySpeed = 0;
  34.     }
  35.     else
  36.     {
  37.         ball.y +=  ySpeed;
  38.     }
  39. }
  40.  
  41. function accUpdateHandler(event:AccelerometerEvent):void
  42. {
  43.     xSpeed +=  event.accelerationX * 2;
  44.     ySpeed -=  event.accelerationY * 2;
  45.    
  46.     txtX.text = new String(event.accelerationX);
  47.     txtY.text = new String(event.accelerationY);
  48.     txtZ.text = new String(event.accelerationZ);
  49. }

Agora basta pedir para testar no emulador do Adobe Device Central CS5, devemos ter algo parecido com isto:

Adobe Device Central CS5


DOWNLOAD SOURCE

Para saber mais:
http://help.adobe.com/en_US/flashlite/dev/4/index.html




« Entradas anteriores | Entradas recentes »

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2791 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com