Enlaces directos:


Entradas:

Nuevo Flex!

Fascinante!!!! esta vez se han pasado cuatro calles!!!!!
Ahora puedes construir tu propio Flex a medida! Puedes hacerlo a través de un configurador muy visual hecho con…. Flex!
Además esta vez tenemos una web especialmente creada para Flex!
Corre, serás uno de los primeros en verlo ;)

* Nuevo Flex

[ via faratasystems.com ]

¿Métodos privados?

Me he encontrado con que el componente mx.controls.ProgressBar del SDK de Flex 3 tiene un bug. El bug se da en el método updateDisplayList(), que en un momento dado intenta acceder a una propiedad que es nula. El típico Cannot access a property or method of a null object reference ….

Llegado a este punto me he dicho:
- vale, no pasa nada. Creo una subclase de ProgressBar, sobreescribo updateDisplayList() y me aseguro de que la propiedad en cuestión no se acceda con valor nulo. Parece simple…
Pues no… resulta que el método updateDisplayList(), un método con visibilidad protected, durante su ejecución hace una llamada a un método privado y además utiliza propiedades privadas durante su ciclo de vida, lo cuál inutiliza totalmente el que el método sea sobrescribible ya que a la práctica no lo es.

Yo me pregunto… ¿tiene sentido hacer esto? Yo opino que es un error de diseño del método. Si expones un método a las subclases tienes que tener cuidado de que pueda ser sobrescrito.

Y ya poniéndonos fuertes… ¿Tiene sentido utilizar propiedades privadas en un SDK? Nunca sabes lo que los usuarios van a hacer con tus APIs, así que no te confíes y define la visibilidad más restrictiva con protected.
Vaya, digo yo…

El futuro de ActionScript

No sé en otros lenguajes, pero con ActionScript los desarrolladores siempre se han caracterizado por tener un especial afán en descubrir “qué es lo que viene en la próxima versión”, supongo que se ha debido al hecho que en cada nueva versión siempre se le ha sacado el 200% del jugo tanto al lenguaje como al runtime.
Pues bien, para lo que sean de este grupo ( me incluyo :) ) aquí dejo un par de enlaces muy interesantes que desvelan las novedades de ECMAScript 4 que van a ser incluídas (o es muy posible que vayan a ser incluídas) en ActionScript.

Cursos Flex

Si a ti o a tu empresa os interesa aprender Flex o tecnologías basadas en la plataforma Flash pero no sabéis cuándo ni por dónde empezar aquí dejo un nuevo feed RSS que carlosrovira formación ha preparado al respecto: http://www.carlosrovira.com/blog/?feed=rss2&cat=11.
Desde ahí se mantendrá un archivo actualizado de los últimos cursos que se van a impartir próximamente en Madrid, Barcelona y otras ciudades de la geografía Española por parte de esta empresa.

AS3 eval(): compilar AS3 desde el Flash Player

Algo que hasta ahora parecía imposible se ha hecho realidad gracias a metal.hurlant.com/blog/ y al proyecto Tamarin que Adobe a donado a la fundación Mozilla.

Se trata de la posibilidad de poder compilar porciones de código ActionScript en tiempo de ejecución desde el Flash Player.
El proyecto que permite esto se llama As3Eval y es una librería (licencia MPL/GPL/LGPL) que porta el compilador de Tamarin a AS3. El resultado final es que podemos crear aplicaciones que se autocompilan a si mismas, exactamente de la misma forma en que lo hacemos con el homólogo eval() en Javascript.

En la página del proyecto hay un enlace a una demo en la que puedes testear tu propio código, por ejemplo:

Actionscript:
  1. import mx.core.Application;
  2. import mx.controls.Button;
  3. var b:Button = new Button();
  4. b.label = "Hola Mundo!";
  5. b.x = b.y = 200;
  6. b.addEventListener( "click", clickHandler );
  7. Application.application.addChild(b);
  8. function clickHandler(evt):void
  9. {
  10.      Application.application.alpha = Math.random();
  11. }

simplemente increíble....

Y por si fuera poco, dos días después de lanzar esto, el mismo chico nos vuelve a sorprender con JSObject, un wrapper de JavaScript para AS3. Algo parecido al JSObject de Java pero para AS3.

* ActionScript 3 Eval Library
* AS3 JSObject

Curso Flex en Barcelona: “Desarrollando Clientes Ricos con Adobe Flex”

carlosrovira.com formación ha preparado un nuevo curso en Barcelona: "Desarrollando Clientes Ricos con Adobe Flex", el cual tendré el placer de impartir a partir del próximo día 22 de Enero del 2008.
El curso se dará Martes y Jueves de 19h a 22h, un horario creemos, apropiado para compatibilizar con otras obligaciones.
Todavía queda alguna plaza para esta convocatoria, si te interesa debes ponerte en contacto con Encarna Ferreiro para reservar plaza ya que tenemos que cerrarlo en los próximos días.
El correo es encar (.) ferreiro (@) carlosrovira (.) com.
Nos vemos en Enero!

SoundFacade: la arquitectura de audio simplificada

La arquitectura de audio en ActionScript 3 ha sufrido una evolución considerable en cuanto a funcionalidad pero esto ha provocado que también aumente su complejidad.
La clase SoundFacade es una aproximación simplista de lo que podría ser la aplicación del patrón Facade a la librería de audio de AS3. No se contemplan todas las posibilidades pero seguro es un buen punto de partida para que aquél que lo necesite encuentre muchas funcionalidades básicas implementadas.
La clase es un Singleton porque normalmente se trabaja con una única instancia de sonido a la vez y porque de este modo se simplifica aún más el trabajo con ella.
Con la clase viene el siguiente ejemplo de implementación con realizado con Flex.



SoundFacade.as

Actionscript:
  1. package com.joangarnet.sound
  2. {
  3.     import flash.events.Event;
  4.     import flash.events.EventDispatcher;
  5.     import flash.events.IOErrorEvent;
  6.     import flash.events.ProgressEvent;
  7.     import flash.media.ID3Info;
  8.     import flash.media.Sound;
  9.     import flash.media.SoundChannel;
  10.     import flash.media.SoundTransform;
  11.     import flash.net.URLRequest;
  12.    
  13.     [Event(name="complete", type="flash.events.Event")]
  14.     [Event(name="id3", type="flash.events.Event")]
  15.     [Event(name="progress", type="flash.events.ProgressEvent")]
  16.     [Event(name="ioError", type="flash.events.IOErrorEvent")]
  17.    
  18.     public class SoundFacade extends EventDispatcher
  19.     {
  20.         /*
  21.          * Singleton
  22.          */
  23.         private static var __instance:SoundFacade;
  24.         public static function getInstance():SoundFacade
  25.         {
  26.             if( __instance == null ) __instance = new SoundFacade( new SingletonEnforcer() );
  27.             return __instance;
  28.         }
  29.  
  30.         /*
  31.          * Properties
  32.          */          
  33.         private var sound:Sound;
  34.         private var channel:SoundChannel;
  35.         private var pausePosition:Number;
  36.         private var soundTransform:SoundTransform;
  37.         private var __isPLaying:Boolean;
  38.         private var __isLoading:Boolean;
  39.         private var __id3:ID3Info;
  40.         public var loops:uint;
  41.         public var autoPlay:Boolean;
  42.        
  43.         /*
  44.          * Constructor
  45.          */
  46.         public function SoundFacade( singletonEnforcer:SingletonEnforcer )
  47.         {
  48.             loops = 0;
  49.             autoPlay = true;
  50.             __isPLaying = false;
  51.             __isLoading = false;
  52.             soundTransform = new SoundTransform( .5 );
  53.             pausePosition = 0;
  54.         }
  55.        
  56.         /*
  57.          * private API
  58.          */
  59.         private function initializeSound():void
  60.         {
  61.             sound = new Sound();
  62.             sound.addEventListener( Event.COMPLETE, onComplete, false, 0, true );
  63.             sound.addEventListener( Event.ID3, onID3, false, 0, true );
  64.             sound.addEventListener( IOErrorEvent.IO_ERROR, onIOError, false, 0, true );
  65.             sound.addEventListener( ProgressEvent.PROGRESS, onProgress, false, 0, true );
  66.         }
  67.        
  68.         /*
  69.          * public API
  70.          */
  71.         public function load( url:String ):void
  72.         {
  73.             stop();
  74.             close();
  75.             initializeSound();
  76.             sound.load( new URLRequest(url) );
  77.             __isLoading = true;
  78.         }
  79.        
  80.         public function play():void
  81.         {
  82.             if( __isPLaying || __isLoading ) return;
  83.             try {
  84.                 channel = sound.play( pausePosition, loops );
  85.                 channel.soundTransform = soundTransform;
  86.                 __isPLaying = true;
  87.             }catch(e:Error){}
  88.         }
  89.        
  90.         public function pause():void
  91.         {
  92.             if( !__isPLaying || __isLoading ) return;
  93.             pausePosition = channel.position;
  94.             channel.stop();
  95.             __isPLaying = false;
  96.         }
  97.        
  98.         public function stop():void
  99.         {
  100.             if( __isLoading ) return;
  101.             try{
  102.                 channel.stop();
  103.                 pausePosition = 0;
  104.                 __isPLaying = false;
  105.             }catch(e:Error){}
  106.         }
  107.        
  108.         public function close():void
  109.         {
  110.             try{
  111.                 sound.close();
  112.             }catch(e:Error){}
  113.             pausePosition = 0;
  114.             __isPLaying = false;
  115.         }
  116.        
  117.         public function get volume():Number
  118.         {
  119.             return soundTransform.volume;
  120.         }
  121.         public function set volume( volume:Number ):void
  122.         {
  123.             soundTransform.volume = volume;
  124.             if( channel ) channel.soundTransform = soundTransform;
  125.         }
  126.        
  127.         public function get isPlaying():Boolean
  128.         {
  129.             return __isPLaying;
  130.         }
  131.        
  132.         public function get isLoading():Boolean
  133.         {
  134.             return __isLoading;
  135.         }
  136.        
  137.         public function get id3():ID3Info
  138.         {
  139.             return __id3;
  140.         }
  141.        
  142.         public function get duration():Number
  143.         {
  144.             return sound.length;
  145.         }
  146.        
  147.         /*
  148.          * Events
  149.          */
  150.         private function onComplete( evt:Event ):void
  151.         {
  152.             __isLoading = false;
  153.             if( autoPlay ) play();
  154.             dispatchEvent( evt );
  155.         }
  156.        
  157.         private function onID3( evt:Event ):void
  158.         {
  159.             __id3 = sound.id3;
  160.             dispatchEvent( evt );
  161.         }
  162.        
  163.         private function onIOError( evt:IOErrorEvent ):void
  164.         {
  165.             dispatchEvent( evt );
  166.         }
  167.        
  168.         private function onProgress( evt:ProgressEvent ):void
  169.         {
  170.             dispatchEvent( evt );
  171.         }
  172.     }
  173. }
  174. class SingletonEnforcer{}

Next Page »