Clase para cargar contenido externo en Actionscript 3
Esta es una clase que tengo escrita para reutilizar y ahorrarme el tiempo de escribir el mismo código una y otra vez, se trata de una clase para cargar contenido externo.
La clase lo único que hace es cargar el contenido con un Loader y guardar una referencia. También dispara un evento cuando la carga se ha realizado para poder detectarlo desde fuera de la clase.
Esta es la clase:
{
import flash.display.Sprite;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.EventDispatcher;
//-----------------------------------------
public class Contenedor extends Sprite
{
public static var CARGADO:String = "cargado";
private var _clip:Sprite = new Sprite();
private var _cargado:Boolean = false;
private var _content:Sprite;
private var _urlAsset:String;
//-----------------------------------------
public function Contenedor(asset:String=null)
{
_urlAsset = asset;
if (_urlAsset != null) {
iniLoad();
}
}
//-----------------------------------------
private function iniLoad(asset:String=null):void
{
var loader:Loader = new Loader();
var request:URLRequest = new URLRequest(_urlAsset);
loader.load(request);
var dispatcher:EventDispatcher = loader.contentLoaderInfo;
dispatcher.addEventListener(Event.INIT, registraContenido);
addChild(loader);
}
//-----------------------------------------
public function set asset(a:String):void
{
if (_urlAsset != null) {
removeChild(_clip);
}
_urlAsset = a;
iniLoad();
}
//-----------------------------------------
public function get clip():Sprite
{
return _clip;
}
public function get cargado():Boolean
{
return _cargado;
}
//-----------------------------------------
public function registraContenido(e:Event):void
{
_cargado = true;
_clip = e.target.content;
dispatchEvent(new Event(Contenedor.CARGADO));
}
//-----------------------------------------
}
}
Su uso es muy simple:
var cont:Contenedor = new Contenedor();
cont.asset = "pelicula.swf"
Y para detectar la carga completa:
function listo(e:Event):void
{
trace("carga lista")
}
Hay que decir que tambien tiene la posibilidad de cambiar el contenido simplemente asignándole otra ruta:
Es una clase muy simple pero que me resulta útil y es fácilmente extendible para crear otras clases más complejas con preloads o lo que sea...
Espero que también les resulte útil
Post relacinonados:




November 30th, 1999 at 12:00 am
Muy buena clase Zguillez!! Bastante útil y práctica. Muchas gracias. (Y)
November 30th, 1999 at 12:00 am
Ey! Esta muy bien! No sabrÃa hacer yo la clase, pero entiendo su finalidad, y me parece algo bastante útil. U_U
Mola (y)
November 30th, 1999 at 12:00 am
[...] A raÃz de una pregunta en un post anterior explicaré cómo detectar eventos personalizados entre clases de Actionscript 3. Para poder, por ejemplo, que una clase pueda detectar cuando otra clase a ejecutado una acción en concreto o ha completado una carga de datos externa. [...]
November 5th, 2008 at 10:00 pm
Zguillez! antes que nada muchas gracias por tu constante y valioso aporte.
.
Estuve probando tu clase pero no logro q funcione, el swf externo nunca se vé (no me dá ningun mensaje de error). Constaté q esté bien especificado el paquete al q pertenece tanto en el frame del fla desde donde la llamo, como de la misma clase
Gracias!
November 14th, 2008 at 11:57 am
@Carolina: Mira, te monté un .FLA de ejemplo para que veas como funciona:
http://www.codigoactionscript.org/files/class-contenedor.zip
December 12th, 2008 at 12:54 pm
Muy buena !! ya la estoy usando, gracias
tengo un problema que no consigo solucionar, y es que no encuentro cómo poner un controlador de error para el caso en el que la url está mal.
Si se le pasa una url correcta funciona de maravilla, pero si le paso una url incorrecta salta la ventana de error :
Error al abrir la URL 'http://www.cualquiercosa.com/foto.jpg'
Error #2044: IOErrorEvent no controlado: text=Error #2035: No se encuentra la dirección URL.
si el usuario tiene flash instalado va a ver la ventana de error y eso es lo que no quiero que pase. Retoqué un poco tu clase intentando agregar el controlador de errores que vi en la documentación de adobe, agregué lo siguiente en la linea 13:
import flash.events.IOErrorEvent;
y lo siguiente en la linea 42:
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, f_errorLoading);
y abajo del todo la funcion :
public function f_errorLoading(event:IOErrorEvent):void {
trace("error controlado, no encuentra la url.");
}
pero me sigue dando el mismo error. ¿tienes idea cómo se puede arreglar eso?
Muchas gracias !
January 22nd, 2009 at 9:11 pm
Que tal, tengo el mismo error:
...Error #2035: No se encuentra la dirección URL ...
Localmente funciona normal, pero al abrir la URL... me manda el error. Gracias
December 29th, 2009 at 2:40 pm
Hola. Gracias por la clase, tengo un pequeño problema, dices que se puede cambiar el contenido simplemente cambiando el asset. Pues bien, he añadido este código al .fla que ha dejado en los comentarios:
setInterval(cambia,5000);
function cambia()
{
_contenedor.asset = "contenedor2.swf";
}
y cuando pasan los 5 segundos, me devuelve este error:
ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.
at flash.display::DisplayObjectContainer/removeChild()
at com.zguillez.display::Contenedor/set asset()
at contenedor_fla::MainTimeline/cambia()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at SetIntervalTimer/onTimer()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()
Como puedo cambiar el contenido del contenedor?
Muchas gracias.
February 4th, 2010 at 5:54 am
Hola.
una pregunta, se puede usar los objetos de libreria del swf cargado dentro de flex ?
si se puede como se hacen?
Gracias