Enlaces directos:
- Últimas 30 entradas
- Nuevo Flex!
- ¿Métodos privados?
- El futuro de ActionScript
- Cursos Flex
- AS3 eval(): compilar AS3 desde el Flash Player
- Curso Flex en Barcelona: “Desarrollando Clientes Ricos con Adobe Flex”
- SoundFacade: la arquitectura de audio simplificada
- Limitador rectangular sin condicionales
- Flash, Flex, AIR y pizza gratis!
- Liquid Components: nuevo set de componentes para Flash CS3
- Doctrine: ORM Open Source para PHP 5.2+
- AS3 clase Calendar (Julian/Gregorian)
- amfphp de nuevo en marcha
- Tendencias y salarios en el mundo de las RIA
- Nos vemos en Adobe MAX 2007 Europe
- Propiedades por directorio en Subversion
- [OT] The IT Crowd
- Flex+Cairngorm en castellano desde MIF
- Formación Flex y Live Cycle Data Services en carlosrovira.com
- sprintf versión AS3
- Mantener un programa en la cabeza
- Astra Flash Components de Yahoo!
- ActionScript 3 Audio Library
- Talleres subflash ‘07
- php mkdir en safe mode
- Desarrollo de aplicaciones AIR con Flash CS3
- AS3 runtime font embedding
- II Open Source Flash Conference mañana
- Apollo incluirá SQLite
- Entorno de prueba para desarrolladores web
- Todas las entradas
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 ;)
[ 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:
-
import mx.core.Application;
-
import mx.controls.Button;
-
var b:Button = new Button();
-
b.label = "Hola Mundo!";
-
b.x = b.y = 200;
-
b.addEventListener( "click", clickHandler );
-
Application.application.addChild(b);
-
function clickHandler(evt):void
-
{
-
Application.application.alpha = Math.random();
-
}
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
-
package com.joangarnet.sound
-
{
-
import flash.events.Event;
-
import flash.events.EventDispatcher;
-
import flash.events.IOErrorEvent;
-
import flash.events.ProgressEvent;
-
import flash.media.ID3Info;
-
import flash.media.Sound;
-
import flash.media.SoundChannel;
-
import flash.media.SoundTransform;
-
import flash.net.URLRequest;
-
-
[Event(name="complete", type="flash.events.Event")]
-
[Event(name="id3", type="flash.events.Event")]
-
[Event(name="progress", type="flash.events.ProgressEvent")]
-
[Event(name="ioError", type="flash.events.IOErrorEvent")]
-
-
public class SoundFacade extends EventDispatcher
-
{
-
/*
-
* Singleton
-
*/
-
private static var __instance:SoundFacade;
-
public static function getInstance():SoundFacade
-
{
-
if( __instance == null ) __instance = new SoundFacade( new SingletonEnforcer() );
-
return __instance;
-
}
-
-
/*
-
* Properties
-
*/
-
private var sound:Sound;
-
private var channel:SoundChannel;
-
private var pausePosition:Number;
-
private var soundTransform:SoundTransform;
-
private var __isPLaying:Boolean;
-
private var __isLoading:Boolean;
-
private var __id3:ID3Info;
-
public var loops:uint;
-
public var autoPlay:Boolean;
-
-
/*
-
* Constructor
-
*/
-
public function SoundFacade( singletonEnforcer:SingletonEnforcer )
-
{
-
loops = 0;
-
autoPlay = true;
-
__isPLaying = false;
-
__isLoading = false;
-
soundTransform = new SoundTransform( .5 );
-
pausePosition = 0;
-
}
-
-
/*
-
* private API
-
*/
-
private function initializeSound():void
-
{
-
sound = new Sound();
-
sound.addEventListener( Event.COMPLETE, onComplete, false, 0, true );
-
sound.addEventListener( Event.ID3, onID3, false, 0, true );
-
sound.addEventListener( IOErrorEvent.IO_ERROR, onIOError, false, 0, true );
-
sound.addEventListener( ProgressEvent.PROGRESS, onProgress, false, 0, true );
-
}
-
-
/*
-
* public API
-
*/
-
public function load( url:String ):void
-
{
-
stop();
-
close();
-
initializeSound();
-
sound.load( new URLRequest(url) );
-
__isLoading = true;
-
}
-
-
public function play():void
-
{
-
if( __isPLaying || __isLoading ) return;
-
try {
-
channel = sound.play( pausePosition, loops );
-
channel.soundTransform = soundTransform;
-
__isPLaying = true;
-
}catch(e:Error){}
-
}
-
-
public function pause():void
-
{
-
if( !__isPLaying || __isLoading ) return;
-
pausePosition = channel.position;
-
channel.stop();
-
__isPLaying = false;
-
}
-
-
public function stop():void
-
{
-
if( __isLoading ) return;
-
try{
-
channel.stop();
-
pausePosition = 0;
-
__isPLaying = false;
-
}catch(e:Error){}
-
}
-
-
public function close():void
-
{
-
try{
-
sound.close();
-
}catch(e:Error){}
-
pausePosition = 0;
-
__isPLaying = false;
-
}
-
-
public function get volume():Number
-
{
-
return soundTransform.volume;
-
}
-
public function set volume( volume:Number ):void
-
{
-
soundTransform.volume = volume;
-
if( channel ) channel.soundTransform = soundTransform;
-
}
-
-
public function get isPlaying():Boolean
-
{
-
return __isPLaying;
-
}
-
-
public function get isLoading():Boolean
-
{
-
return __isLoading;
-
}
-
-
public function get id3():ID3Info
-
{
-
return __id3;
-
}
-
-
public function get duration():Number
-
{
-
return sound.length;
-
}
-
-
/*
-
* Events
-
*/
-
private function onComplete( evt:Event ):void
-
{
-
__isLoading = false;
-
if( autoPlay ) play();
-
dispatchEvent( evt );
-
}
-
-
private function onID3( evt:Event ):void
-
{
-
__id3 = sound.id3;
-
dispatchEvent( evt );
-
}
-
-
private function onIOError( evt:IOErrorEvent ):void
-
{
-
dispatchEvent( evt );
-
}
-
-
private function onProgress( evt:ProgressEvent ):void
-
{
-
dispatchEvent( evt );
-
}
-
}
-
}
-
class SingletonEnforcer{}
zip














