logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!
Fev 24

FlexUnit 4 – Testando componentes visuais

Escrito por DClick Team em 1, 4, 6, app, AR, class, classe, collection, Componente, Componentes, DataProvider, demo, Dica, event, EventListener, Evento, Flex, for, function, handle, ide, IE, if, int, lista, O, on, problema, processo, RIA, Ria’s Geral, Sem categoria, tag, TAT, Teste, Twitter, UI, update, XML, XMLList @ 02 24th, 2011 | 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 »

Bom, acho que essa dica vai ajudar se você está pensando em testar componentes visuais.

No projeto do componente de organograma para a Petrobrás, além dos testes unitários padrões eu me aventurei um pouco com testes visuais do componente para me assegurar que dada uma modificação de algumas propriedades no componente o mesmo estava modificando corretamente sua visualização e avisando os componentes de suporte como Navigator, Logger dessas modificações.

O problema de testes visuais que acredito que todos saibam está no ciclo de vida dos componentes. Não conseguimos ser determinísticos em quanto tempo o componente estará pronto para sofrer asserts em suas propriedades. Vamos começar com o setUp e o tearDown de um teste unitário visual.

Vamos utilizar o FlexUnit 4.x nos casos de teste

1
2
3
4
5
6
7
8
9
10
11
12
[Before( async, ui )]
public function setUp ():void {
_chart = new OrganizationChart();
Async.proceedOnEvent( this, _chart, FlexEvent.CREATION_COMPLETE, 1000 )
UIImpersonator.addChild( _chart );
}

[After( ui )]
public function tearDown ():void {
UIImpersonator.removeChild( _chart );
_chart = null;
}

[Before( async, ui )]
Será executado antes de todos os casos de teste. As indicações async e ui na metadata dizem para o Runner do teste que esse método possui processos assíncronos e que o mesmo deve verificar a classe Async para proceder com o teste.

Async.proceedOnEvent( this, _chart, FlexEvent.CREATION_COMPLETE, 1000 )
Avisa que o teste só deve continuar quando o evento FlexEvent.CREATION_COMPLETE for disparado pelo componente.

UIImpersonator.addChild( _chart );
Adiciona o componente como um filho de uma espécie de Application que iniciará o ciclo de vida de criação do componente.

[After( ui )]
Executando após o teste em questão ser executado. Faz a limpeza dos elementos criados anteriormente.

UIImpersonator.removeChild( _chart );
Remove o componente da lista de filhos e executa o ciclo de vida de destruição do componente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Test( async )]
public function testDataProvider():void {
var x:XML = sampleXML.data as XML;
var collection:XMLListCollection = new XMLListCollection( new XMLList( x.item ) );

var asyncHandler:Function = Async.asyncHandler( this, updateCompleteHandler, timeout );
_chart.addEventListener( FlexEvent.UPDATE_COMPLETE, asyncHandler );

_chart.dataProvider = collection;
}

private function updateCompleteHandler( event:FlexEvent, passData:Object ):void {
Assert.assertEquals( 10, _chart.dataGroup.numElements );
}

No caso do componente, ao setar o dataProvider ele modifica o dataProvider de um DataGroup interno, que consequentemente vai efetuar a criação dos renderers. Nesse teste estamos validando se “ao preencher o dataProvider o DataGroup está criando os renderers enviados na coleção” efetuando a contagem de elementos presentes no DataGroup.

Utilizando o mesmo tipo de teste assíncrono podemos testar algumas interações do usuário como MouseEvent.MOUSE_CLICK, MouseEvent.MOUSE_MOVE simplesmente pegando a instância do componente criado e executando o evento manualmente. Com isso os listeners serão disparados e você poderá utilizar o Async.asyncHandler para escutar um determinado do componente e efetuar os asserts necessários para validar se a interação modificou as propriedades do componente.

Fev 16

Flex tip: Creating a self-close Alert

Escrito por Pablo Souza em 1, 2009, Adobe, app, AR, auto, BI, Bindable, control, Controls, demo, event, EventListener, Flex, function, handle, if, label, library, MXML, Number, O, on, pt, Ria’s Geral, spark, Ved, window, XML @ 02 16th, 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 »

In the last days I’ve received a lot of questions about how to automatically close a popup window after a certain period of time. In order to demonstrate it let’s implementing a Flex alert that will be self-closed after 5 seconds. Check the code after the jump:

<?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">
<fx:Script>
	[CDATA[
	import mx.controls.Alert;
	import mx.managers.PopUpManager;
?
	private var notificatorTimer:Timer;
	private var myAlert:Alert;
?
	[Bindable]
	public var timeDestroy:Number = 5000;
?
?
	private function startTimer(event:MouseEvent):void
	{
		notificatorTimer = new Timer(timeDestroy, 1);
		notificatorTimer.addEventListener(
			TimerEvent.TIMER_COMPLETE,
			remove_handler);
		notificatorTimer.start();
		myAlert = Alert.show(
			"Wait, I'm gonna be closed after 5 sec ...",
			"MyAlert");
	}
?
?
	private function remove_handler(event:TimerEvent):void
	{
		PopUpManager.removePopUp(myAlert);
	}
?
	]]>
fx:Script>
?
<s:Button label="Abrir Alert"
		  click="startTimer(event)" />
?
s:Application>

Hope you enjoy it!

Fev 11

Eventos no PHP

Escrito por Fábio Batista da Silva em AR, auto, BI, class, classe, custom, Customizando eventos, dados, demo, dispatch, dispatchEvent, Download, event, EventListener, Evento, Eventos, events, Flex, function, git, ide, if, library, O, on, pattern, PHP, pt, RIA, Ria’s Geral, server, string, UI, zend @ 02 11th, 2011 | via http://www.flexria.com.br/home | Sem comentários
Fábio Batista 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 »

Olá,

Depois de seculos sem aparecer resolvi fazer um post para divulgar um pequeno projeto que disponibilizei no github.

Trata se de uma pequena lib que implementa o Pattern Observer bem conhecido no flex através dos events.

O link para o projeto no github é : https://github.com/FabioBatSilva/events O php 5.3 é requisito para o funcionamento

La existe um pequeno wiki sobre o projeto com as funcionalidades básicas.
Desde já peço desculpa pelo inglês…rsrs

Depois de realizar o download dos arquivos
podemos utilizar a lib carregando atravez de algum autoloader como Zend_AutoLoad ou carregando manualmente:

set_include_path('/my/library' . PATH_SEPARATOR . get_include_path());
require_once 'Events/Event.php';
use EventsEvent;

Disparando Eventos :

Para disparar eventos a partir da sua classe vc terá que estender EventDispatcher e utilizar o método dispatchEvent($event)

* Esse metodo tem como parâmetro um objeto do tipo Event que sera disparado

use EventsEvent, EventsEventDispatcher;
?
class MyObject extends EventDispatcher
{
    private $name;
?
    public function setName($name)
    {
        $this->dispatchEvent(new Event(Event::CHANGE));
        $this->name = $name;
    }
?
}

Escutando Eventos :

Para escutar os evento vc deve utilizar o método addEventListener($type,$listener) do objeto que estende a classe EventDispatcher.

* O primeiro parâmetro é uma string que identifica o tipo do evento
* O segundo parâmetro a Closure/Function que será chamada quando o evento disparar

use MyObject;
$object = new MyObject();
?
$object->addEventListener(Event::CHANGE, function($event){
    echo 'My Object Has Changed';
});
?
$object->setName('New Name');

Então quando o nome é alterado o evento do tipo Event::CHANGE é disparado e todos que estiverem ouvindo por esse tipo de evento serão chamados.

Customizando Eventos :
Vc pode criar eventos personalizados, Eles poder servir para adicionar funcionalidades ao evento ou transportar dados.

use EventsEvent;
?
class MyEvent extends Event
{
    const CHANGE_NAME = 'changeName';
?
    public $oldName;
    public $newName;
?
    public function __construct($type, $oldName = null, $newName = null)
    {
        parent::__construct($type);
        $this->oldName  = $oldName;
        $this->newName  = $newName;
    }
}

Então para dispara o evento:

public function setName($name)
{
    $event = new MyEvent(MyEvent::CHANGE_NAME, $this->name, $name);
    $this->dispatchEvent($event);
    $this->name = $name;
}

E capturar os dados na função que esta ouvindo o evento:

$object->addEventListener(Event::CHANGE, function($event){
    echo "My Object Has Changed";
    echo "OLD : " + $event->oldName;
    echo "NEW : " + $event->newName;
});

É bem simples porem pode ser útil.

Abraço e até a próxima

Fev 7

Criando um Alert que fecha sozinho com a classe flash.utils.Timer

Escrito por Pablo Souza em 1, 2009, Adobe, app, AR, auto, BI, Bindable, código, control, Controls, Dica, event, EventListener, exemplo, Flex, function, handle, if, label, library, MXML, Number, O, on, pt, RIA, Ria’s Geral, spark, UI, XML @ 02 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 »

A dica Flex de hoje é para aqueles que nos últimos dias me perguntaram sobre como fechar automaticamente uma janela depois de um certo período de tempo. Para esse exemplo criamos um Alert que será fechado após 5 segundos. Veja 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">
<fx:Script>
	[CDATA[
	import mx.controls.Alert;
	import mx.managers.PopUpManager;
?
	private var notificatorTimer:Timer;
	private var myAlert:Alert;
?
	[Bindable]
	public var timeDestroy:Number = 5000;
?
?
	private function startTimer(event:MouseEvent):void
	{
		notificatorTimer = new Timer(timeDestroy, 1);
		notificatorTimer.addEventListener(
			TimerEvent.TIMER_COMPLETE,
			remove_handler);
		notificatorTimer.start();
		myAlert = Alert.show(
			"Aguarde, serei fechado em 5seg ...",
			"MyAlert");
	}
?
?
	private function remove_handler(event:TimerEvent):void
	{
		PopUpManager.removePopUp(myAlert);
	}
?
	]]>
fx:Script>
?
<s:Button label="Abrir Alert"
		  click="startTimer(event)" />
?
s:Application>

Espero que tenham gostado. Até a próxima!

Dez 30

Dica Flex – Disparando eventos customizados do ItemRenderer com Flex 4

Escrito por Pablo Souza em 1, 2009, Adobe, app, AR, BI, blog, boolean, botão, class, classe, classes, código, components, custom, DataGrid, DataProvider, demo, Dica, dispatch, dispatchEvent, event, EventListener, Evento, Eventos, events, exemplo, flash, Flex, for, function, handle, ide, IE, int, itemRenderer, label, library, lista, LOB, MXML, O, on, problema, problemas, pt, RIA, Ria’s Geral, spark, string, tag, TAT, UI, uint, XML, XP @ 12 30th, 2010 | 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 »

Nossa dica Flex de hoje serve para aqueles que desejam acessar métodos ou propriedades do objeto application ou parent documents de dentro de um item renderer. O Flex nos oferece as seguintes formas de acesso:

mx.core.FlexGlobals.topLevelApplication: Retorna o objeto application principal, que pode ser do tipo spark.components.Application ou mx.core.Application.

mx.core.UIComponent.parentDocument: Retorna o parent document do objeto atual. Usado como alternativa ao exemplo que vamos mostrar em seguida.

mx.core.UIComponent.parentApplication: Retorna o objeto application onde o objeto atual está inserido.

Além das formas acima, uma alternativa mais elegante (e orientada a obejtos) para acessar métodos ou propriedades do parent document ou application é utilizarmos os eventos do Flex.

Imagine que temos uma aplicação que lista todos os seus usuários num datagrid. Em uma de suas colunas temos um item renderer com um botão que exclui esses usuários. Para tal precisaremos acessar um método no parent document, que no nosso exemplo será a própria application. Como vimos anteriormente podemos obter o objeto parent document através da propriedade mx.core.UIComponent.parentDocument e dessa forma chamar nosso método de exclusão. Esse método funciona corretamente, porém gera um grande acoplamento entre os objetos além de quebrar o encapsulamento das classes. Para resolvermos esses problemas vamos fazer com que ao clicar no botão excluir um evento bubble seja disparado e no objeto parent document vamos escutar o evento e então chamar o método de exclusão.

O trecho de código abaixo mostra nossa datagrid com o item renderer que possui o botão de exclusão:

1
2
3
4
5
6
7
8
    <mx:DataGrid id="dataGrid" dataProvider="{model}">
        <mx:columns>
            <mx:DataGridColumn headerText="Nome" dataField="nome" />
            <mx:DataGridColumn
                headerText="Ação" dataField="nome"
                itemRenderer="br.com.rectius.itemRendererExample.ButtonItemRenderer" />
        </mx:columns>
    </mx:DataGrid>

A seguir está o código do nosso item renderer. Repare que ao clicar no botão excluir estamos disparando um evento customizado:

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
<?xml version="1.0" encoding="utf-8"?>
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                          xmlns:s="library://ns.adobe.com/flex/spark"
                          xmlns:mx="library://ns.adobe.com/flex/mx"
                          focusEnabled="true">

    <fx:Metadata>
        [Event(name="ExcluirEvent",type="br.com.rectius.itemRendererExample.ExcluirEvent")]
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import br.com.rectius.itemRendererExample.event.UsersEvent;

            protected function lblData_clickHandler(event:MouseEvent):void
            {
                var excluirEvent:UsersEvent = new UsersEvent(UsersEvent.EXCLUIR_EVENT, dataGridListData.label, true);
                dispatchEvent(excluirEvent);
            }
        ]]>
    </fx:Script>

    <s:Button id="lblData" top="0" left="0" right="0" bottom="0"
              label="Excluir" click="lblData_clickHandler(event)" />

</s:MXDataGridItemRenderer>

A tag Metadata expõe ao parent document o evento customizado do botão excluir:

1
2
3
    <fx:Metadata>
        [Event(name="ExcluirEvent",type="br.com.rectius.itemRendererExample.ExcluirEvent")]
    </fx:Metadata>

Isso nos possibilitou escutar o evento “ExcluirEvent” no parent document:

1
2
3
4
            protected function application1_initializeHandler(event:FlexEvent):void
            {
                dataGrid.addEventListener(UsersEvent.EXCLUIR_EVENT, excluirHandler);
            }

Abaixo você pode ver o evento que criamos para encapsular o usuário a ser excluído. Nesse exemplo estamos setando na propriedade data do nosso evento UsersEvent uma string com o nome do usuário, porém num cenário real poderíamos enviar o ID do usuário, um Value Object que armazenaria todas as propriedades do usuário clicado, ou qualquer outro objeto conveniente para sua situação:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package br.com.rectius.itemRendererExample.event
{
    import flash.events.DataEvent;

    public class UsersEvent extends DataEvent
    {
        public static var EXCLUIR_EVENT:String = "ExcluirEvent";

        public function UsersEvent(type:String, data:String="", bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable, data);
        }
    }
}

Esperam que tenham gostado. Baixem aqui o projeto de exemplo.

Até a proxima!

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




Set 21

Trabalhando com exceções com Adobe Flex e Zend AMF

Escrito por Leonardo França em 1, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Actionscript3, Adobe, Adobe Flex, AMF, api, app, AR, arte, back, bar, BI, C#, class, classe, código, Curso, demo, dispatch, Download, err, erro, event, EventListener, flash, Flash Platform, Flex, for, framework, function, handle, ide, if, image, int, Java, Javascript, lite, mg, O, on, PHP, platform, programação, pt, RIA, Ria’s Geral, server, servidor, string, Tema, Teste, UI, uint, XP, zend, Zend Amf, zendAMF, zendFramework @ 09 21st, 2010 | via http://www.leonardofranca.com.br | 1 comentário
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 »



Algumas linguagens de programação possuem o recurso de se trabalhar com exceções como PHP, ActionScript 3.0, Java, C# etc. É um recurso que se for bem usado, torna-se poderoso e ajuda a evitar futuras dores de cabeça para seu sistema. Uma exceção nada mais é que a possibilidade de tratar um erro sem necessariamente parar totalmente seu programa.

O suporte a exceções foi adicionado no PHP a partir da versão 5, e pode ser usando em conjunto com o Adobe Flex, neste caso utilizarei o Zend AMF, uma implementação do protocolo AMF para se trabalhar em conjunto com a Flash Platform e seu server-side rodando PHP fazendo parte do ZendFramework.
Considera-se uma boa prática você criar sua classe de exceção extendendo a classe Zend_Exception.

PLAIN TEXT
PHP:

  1. <?php
  2. class MyException extends Zend_Exception{}

Por enquanto só isso basta, podemos implementar mais métodos de acordo com a necessidade de nosso sistema.
Agora criaremos uma classe para disparar a exceção, no PHP isso é feito usando a palavra reservada “throw”.

PLAIN TEXT
PHP:

  1. <?php
  2. class HelloException  
  3. {
  4.      public function dispatchException()
  5.      {
  6.         throw new MyException("dispatch exception!!!");
  7.      }  
  8. }
  9. ?>

No Flex vamos chamar o método normalmente usando a classe RemoteObject.

PLAIN TEXT
ACTIONSCRIPT3:

  1. protected function application1_creationCompleteHandler(event:FlexEvent):void
  2.             {
  3.                 ro = new RemoteObject();
  4.                 ro.destination = "nao faz diferença nenhuma usando com Zend AMF";
  5.                 ro.endpoint = "http://localhost:81/ZendAmf/teste_exception.php";
  6.                 ro.source = "br.com.leonardofranca.HelloException";
  7.                 ro.addEventListener(ResultEvent.RESULT, handlerResult);
  8.                 ro.addEventListener(FaultEvent.FAULT, handlerFault);
  9.                 ro.dispatchException();
  10.             }

Nossa atenção se voltará para o FaultEvent, ele é responsável por capturar as exceções vindas do servidor. Basicamente só precisaremos mostrar ao usuário o faultString.

PLAIN TEXT
ACTIONSCRIPT3:

  1. private function handlerFault(fault:FaultEvent):void
  2.             {
  3.                 trace(fault.fault.faultCode);
  4.                 trace(fault.fault.faultDetail);
  5.                 trace(fault.fault.faultString);
  6.                 Alert.show(fault.fault.faultString,"Atenção");
  7.             }

Devemos ter o seguinte resultado:

Exception

Código completo:
Download PHP
Download Flex

Set 16

Adobe AIR Update Framework + ANT Task + Hudson

Escrito por DClick Team em 1, 4, 6, Access, action, Actionscript, Adobe, Adobe Air, Air, apache, api, Aplicativos, app, AR, arte, as3, auto, back, BI, blog, bug, class, classe, cliente, codec, código, configuração, Curso, Debug, demo, Desenvolvedor, Desenvolvimento, developer, Dica, Download, err, erro, error, event, EventListener, exemplo, flash, flash builder, Flex, FlexBuilder, fonte, for, Formação, framework, Frameworks, FullScreen, function, git, handle, html, ide, IE, if, image, int, Java, library, live, mg, MXML, NaN, Number, O, on, Outros, Password, Pessoal, player, Plugin, processo, procura, Projetos, pt, RIA, Ria’s Geral, RoR, screen, Screencast, Sem categoria, Software, swf, tag, TAT, Tema, template, Teste, tool, tv, Twitter, UI, update, Ved, vs, wave, window, XML, XP @ 09 16th, 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 »

Twitter!

Umas das coisas que eu acho mais interessante quando estou desenvolvendo para Adobe AIR é a facilidade de realizar as atualizações da aplicação, é muito simples e fácil de implementar uma maneira automatica para as atualizações. Na verdade a implementação já existe, só é preciso saber como utilizar.

Neste post vou falar um pouco sobre o framework de update das aplicações air e como tirar proveito disso com um processo deployment também automatico utilizando ANT para compilar o projeto e Hudson para separar os ambientes e etc.

Air Update Framework – Atualização da aplicação

O framework de update do air trabalha basicamente com 3 coisas:

A classe ApplicationUpdaterUI e os arquivos de configurações update.xml e updateConfig.xml . Independente de como será feito o deployment da sua aplicação, o modo de atualização será sempre baseado nesta classe e nestes arquivos.

Você também pode utilizar esta classe atribuindo manualmente as propriedades que são lidas pelos arquivos de configuração, entretanto, com arquivo é possível alterar os valores depois que o AIR ja tiver sido compilado.

ApplicationUpdaterUI

Esta classe utiliza o arquivo de configuração updateConfig.xml para saber aonde procurar por uma atualização e informar em caso exista uma versão mais recente.

Esta classe precisa basicamente de 3 coisas.

  1. Setar a propriedade configurationFile com o arquivo updateConfig.xml
  2. Inicializar
  3. E verificar se há uma nova versao.

Segue abaixo um trecho de código com a utilização:

1
2
3
4
5
6
7
8
9
10
11
public static function checkNow(updateConfigFile:File):void
{
updater.configurationFile = updateConfigFile;
updater.addEventListener(UpdateEvent.INITIALIZED, updateInitializeHandler);
updater.initialize();
}

private static function updateInitializeHandler(event:UpdateEvent):void
{
updater.checkNow();
}

No projeto que irei disponibilizar no final do post eu estou utilizando a classe VersionManager criada aqui na DClick para facilitar um pouco essa parte de configurar e inicializar o updater ;)

updateConfig.xml

Dentro do arquivo updateConfig.xml está todas as configurações de como a verificação de novas atualizações serão feitas. A classe ApplicationUpdaterUI lê estas informações durante a inicialização.

update.xml

Este arquivo contem a informação de qual é a versão atual do sistema e onde baixa-la. O update framework compara a versão do software que está sendo executada ( token <version> dentro do xml que descreve a aplicação air ) e caso for diferente da que esta no update.xml ele irá tentar fazer atualização para a nova versão.

ANT Task – Compilação através de linha de comando

Agora que agente ja viu como funciona o sistema para atualização de versão dos aplicativos AIR, podemos podemos deixar o processo de distribuição ainda mais rapido. Vamos ver como gerar a nova versão pelo plugin do flex e depois como gerar utilizando um script ANT

O plugin do flex possibilida fazer o export do projeto para o arquivo .air, basta clicar em project/export release build (imagem abaixo).

Entretanto deste modo cabe a você antes de executar o export configurar qual será a nova versão do aplicativo, e para qual ambiente ( producao/teste/cliente/etc ) você esta compilando esta nova versão.

Em um projeto desenvolvido com integração continua com o cliente, onde varias versões são compiladas durante o desenvolvimento, fazer o build da aplicação não é a melhor escolha.

Uma alternativa é criar um script ANT para buildar o projeto, com ele é possível buildar o projeto e a cada build alterar a versão do aplicativo, deste modo sem muito esforço você tem uma maneira mais prática para gerar as versões da aplicação. O esforço fica em criar o script a primeira vez porque dependendo do tamanho do projeto ( dependencia entre outros projetos, etc ) o script pode ficar grande e complexo.

No final do post vou deixar um link para um projeto no github, a ideia é que este projeto funcione como um template básico para quando for desenvolver um app em air, pois ele ja define a estrutura de pastas build/ambiente e também um script ANT padrao para buildar o projeto de acordo com cada ambiente que for necessário. O script esta todo comentado, de modo que é possível enter cada passo que esta sendo feito.

Como funciona o ANT para o Flex/Air?

O script é dividido em targets ( passos ) que são executados numa ordem definida pelo criador.

Por ex: Os passos básicos para gerar o .air são

  1. Compilar o projeto e gerar o swf.
  2. Gerar o instalador .air a partir do swf.

Compilação do SWF:

Para compilar o projeto e gerar o swf o script ANT utiliza um jar chamado flexTasks.jar. Primeiro é necessário incluir este jar dentro do script atráves da tag <taskdef /> do ant ( veja abaixo ):

Depois de incluir o jar como recurso é possível compilar o projeto utilizando a tag  ( veja abaixo ):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<mxmlc file=“${air.src}/${air.app}.mxml” output=“${temp.dir}/${air.app}.swf” actionscript-file-encoding=“UTF-8″
    keep-generated-actionscript=“false” incremental=“false” benchmark=“true” locale=“pt_BR” debug=“false”
    configname=“air” target-player=“10.0.0″ services=“${temp.dir}/${services.file.name}”
    context-root=“{context.root}”>

    <license product=“flexbuilder3″ serial-number=“xxxx-xxxx-xxxx-xxxx-xxxx-xxxx” />

    <default-size height=“768″ width=“1024″ />

    <source-path path-element=“${air.src}” />
    <source-path path-element=“${locale.path}” />
   
    <source-path path-element=“${FLEX_HOME}/frameworks” />
    <library-path dir=“${FLEX_HOME}/frameworks/locale” append=“true”>
        <include name=“{locale}” />
    </library-path>

    <compiler.library-path dir=“${air.libs}” append=“true”>
        <include name=“*.swc” />
    </compiler.library-path>

</mxmlc>

Este exemplo foi extraido do script ANT que está no projeto template. Para ver mais detalhes sobre como utilizar a tag veja o link da adobe

Gerando o .AIR

Uma vez que você ja compilou o projeto e ja gerou o .swf, para gerar o .air você irá utilizar o jar .adt ( Adobe Developer Tool ). Diferente do flexTask.jar, o adt nós não vamos incluir como recurso no script, vamos executa-lo através da tag

Veja abaixo um exemplo extraido do script que esta no projeto de template:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<java jar=“${air.adt}” fork=“true” failonerror=“true”>
    <arg value=“-package” />
    <arg value=“-storetype” />
    <arg value=“${air.storetype}” />
    <arg value=“-storepass”/>
    <arg value=“${air.certpassword}”/>
    <arg value=“-keystore”/>
    <arg value=“${air.cert}”/>
    <arg value=“${air.installer}” />
    <arg value=“${app.description.final}” />
    <arg value=“-C” />
    <arg value=“${temp.dir}” />
    <arg value=“${air.app}.swf” />
    <arg value=“-C” />
    <arg value=“${temp.dir}” />
    <arg value=“update” />
</java>

Com o ADT é possível gerar o .air já autenticado com um certificado ou simplesmente gerar um arquivo .airi sem autenticação e depois em um outro passo autenticar este arquivo intermediario. Para ver mais detalhes dos argumentos que o ADT recebe como passa-los segue o link da adobe

Como alterar a versão da aplicação a cada build?

Apesar de nós já termos visto como é feita a compilação do swf e como é gerado o .air, ainda não vimos como alterar a versão da aplicação a cada build. Muito bem, no script que está no projeto template, isto é feito através da tag Esta tag recebe como parametro um arquivo, e sempre que é executada ela incrementa em um o valor numerico que está dentro do arquivo. Portanto já temos um contador para cada versão. Um dos parametros que o ADT recebe é o ${app.description.final} que na verdade é uma variável que está apontando para xml que descreve esta versão, tudo que temos que fazer é antes de rodar o ADT, alterar o token  deste xml.

Veja abaixo a sequencia de como isto é feito no script que esta no projeto template.

1
2
3
4
5
6
7
8
9
10
<!– Atualiza o contador do arquivo que é refenciado pela propriedade ‘build.number.file’ –>
<buildnumber file=“${build.number.file}” /><!– Gera o codigo final da nova versão –>

<!– Gera o código da nova versão. Neste caso estamos concatenando o valor de ‘project.version’ ( default.properties )
com o novo código gerado pelo build.number
Ex. v1.1 ( v1. = project version ) ( 1 = build number )–>

<property value=“${project.version}${build.number}” name=“full.version” />

<!– atualiza o token version do description final –>
<replace value=“${full.version}” file=“${app.description.final}” token=“[version]“ />

Nestes 3 passos nós atualizamos o numero da versão do ambiente que esta sendo compilado, montamos o codigo final da versão ( neste caso V1, V2, V3 ) e em seguida alteramos o node <version /> do xml que descreve a aplicação  de <version>[version]</version> para <version>v1</version>.

Na próxima vez que rodar o script o token será alterado novamente de <version>[version]</version> para <version>v2</version>. E assim sussesivamente.

Utilizar o Hudson para buildar o projeto com o script ANT

Apesar de ja estar utilizando o ANT para buildar o projeto e o update framework para verificar atualizações, não é muito interessante que o desenvolvedor tenha que ficar rodando manualmente o script ant, e sendo responsável por compilar o ambiente correto e etc. Para fazer este trabalho nós vamos utilizar o hudson.

Com o hudson você pode configurar um job que irá rodar o script ANT de maneira automatica. Além disso, o hudson pode ser integrado com o repositório de código ( git, subversion, cvs, etc ). Portanto após todos os commits da versão serem feitos, basta executar o job do hudson que ele ira baixar todas as alterações no código e em seguida executar o ANT para gerar a nova versão.

No script ANT o parâmetro que indica para qual ambiente estamos rodando é fornecido pelo Hudson, deste modo, para cada ambiente vamos criar um job no hudson.

Abaixo segue um screencast passo a passo de como criar um novo job no hudson ja integrado com o projeto template que esta no github e disponível para download.

Para aqueles que quiserem ver mais detalhes sobre o Hudson, segue o link oficial.

Segue o url para o pessoal que quiser dar uma olhada nos fontes ou até mesmo baixar o projeto/template com essas configuracões de ANT e etc.

http://github.com/thiagofelix/Air-Atualiza–o-Automatica

Ago 27

Detectando movimentos da webcam com Adobe Flash

Escrito por Leonardo França em 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Actionscript 3.0, Actionscript3, Adobe, Adobe Air, Adobe Flex, Air, api, app, AR, back, bar, builder 4, class, classe, classes, código, Componente, control, cs4, Curso, Cursos, dados, Desktop, Download, event, EventListener, Evento, exemplo, filter, flash, flash builder, Flash Builder 4, Flash Player, Flex, Flex 3, Flex 4, fonte, for, framework, function, gc, Google, handle, html, ide, IE, if, image, int, interface, Java, Javascript, label, library, lite, live, Livro, Livros, lógica, menu, mg, motion, movimento, MXML, O, on, PHP, platform, player, produto, programação, progress, pt, reference, RIA, Ria’s Geral, Scroll, spark, swf, tag, Tema, Treinamento, UI, Ved, wave, web, WebCam, window, XML @ 08 27th, 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 »



Um recurso interessante e que pouca gente conhece no Flash Player ou Adobe AIR, é que além de acessar recursos como a webcam do usuário, ele pode também detectar se há ou não movimentos na camera. Isso pode ser útil se você está implementando um sistema de stream ao vivo e quer economizar a banda usada. Por exemplo, só será publicado o stream se a camera tiver algum movimento.

O Flash Player ou Adobe AIR, além de acessar recursos como a webcam do usuário, pode também detectar se há ou não movimentos na camera.

Vamos ver um exemplo usando o Adobe Flash Professional CS5 e com Flash Builder 4(usando o framework Flex 4).

Adobe Flash Professional CS5

  • Crie um arquivo do tipo ActionScript 3.0
  • Aperte F11 para abrir a library, peça para criar um novo simbolo do tipo “video”:

    Library->New Video

  • Aparecerá uma nova janela, de o nome de “cam” e deixe a opção “Video (ActionScript-controlled)” selecionada:

    cam

  • Arraste o componente que você acabou de criar para o stage e de o nome de instância de “cam”, depois redimesione para 320×240.
  • Arraste um componente do tipo ProgressBar da library User Interface. Dê o nome de instância “pbar”.
  • Feito isto, você deve ter algo parecido com isto:

    Stage pronto para começar a programação

Temos nosso stage pronto para começar a programação ActionScript 3.0. Vamos começar com o Flash Player pedindo para ter acesso a webcam e em seguida colocar a imagem da webcam em nosso componente de video.

PLAIN TEXT
ACTIONSCRIPT3:

  1. myCam = Camera.getCamera();
  2. cam.attachCamera(myCam);

Agora basta fazer com que nosso filme escute o evento “ActivityEvent” da webcam.

PLAIN TEXT
ACTIONSCRIPT3:

  1. myCam.addEventListener(ActivityEvent.ACTIVITY,handlerMotion);

E no método handlerMotion, implementamos as ações na ProgressBar.

PLAIN TEXT
ACTIONSCRIPT3:

  1. function handlerMotion(evt:ActivityEvent):void
  2. {
  3.     trace(evt.target.activityLevel);
  4.     pbar.setProgress(evt.target.activityLevel,100);
  5.     if(evt.target.activityLevel <10)
  6.     {
  7.         trace("muito quieto! =õ(");
  8.     }
  9.     else
  10.     {
  11.         trace("eba! festa!!! \o/\O/\o/");
  12.     }
  13. }

Veja o exemplo em funcionamento:

Adobe Flex 4
Agora veremos um exemplo usando o Adobe Flex, vou capturar a camera usando o componente VideoDisplay.

  • Crie um projeto do tipo web(Flex) ou desktop(AIR).
  • Arraste um componente do tipo VideoDisplay e outro do tipo ProgressBar para o palco.
  • Devemos ter algo parecido com isso:
    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="450" minHeight="400" width="450" height="400">
    5.     <s:VideoDisplay id="cam" x="48" y="38" width="360" height="240"/>
    6.     <mx:ProgressBar id="pbar" x="125" y="297"/>
    7. </s:Application>

Basta implementar a programação ActionScript agora, é bem parecido com o modo de como fizemos no Flash. Mudaremos pouca coisa no código ActionScript 3.0.

PLAIN TEXT
ACTIONSCRIPT3:

  1. protected function application1_creationCompleteHandler(event:FlexEvent):void
  2. {
  3.     pbar.mode = "manual";
  4.     myCam = Camera.getCamera();
  5.     var vd:Video = new Video(320,240);
  6.     vd.attachCamera(myCam);
  7.     cam.addChild(vd);
  8.     myCam.addEventListener(ActivityEvent.ACTIVITY, handlerMotion);
  9. }
  10.  
  11. private function handlerMotion(evt:ActivityEvent):void
  12. {
  13.     trace(evt.target.activityLevel);
  14.     pbar.setProgress(evt.target.activityLevel,100);
  15.     if(evt.target.activityLevel <10)
  16.     {
  17.         pbar.label = "muito quieto! =õ(";
  18.     }
  19.     else
  20.     {
  21.         pbar.label = "eba! festa!!! \o/\O/\o/";
  22.     }
  23. }

Agora é so aplicar a lógica para que seja transmitido ou não o stream da webcam do usuário.

DOWNLOAD SOURCE FLASH

DOWNLOAD SOURCE FLEX

Para saber mais:
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Camera.html?allClasses=1

Livros recomendados:
Adobe Flash CS4 Professional Como Fazer 100 Técnicas Essenciais
Flex 3 em Ação
Adobe Flex 3 Treinamento Direto da Fonte

« 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