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:
- package com.zguillez.display
- {
- 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:
- import com.zguillez.display.Contenedor;
- var cont:Contenedor = new Contenedor();
- cont.asset = "pelicula.swf"
Muy buena clase Zguillez!! Bastante útil y práctica. Muchas gracias. (Y)
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)
[…] 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. […]
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!
@Carolina: Mira, te monté un .FLA de ejemplo para que veas como funciona:
http://www.codigoactionscript.org/files/class-contenedor.zip
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 !
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
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.
Hola.
una pregunta, se puede usar los objetos de libreria del swf cargado dentro de flex ?
si se puede como se hacen?
Gracias
hola,estoy haciendo un proyecto grande, que tiene varias peliculas.swf, una llama a otra y ésta a otra…etc.., el caso q todo me funcionaba bien y cargaba el swf de cada una poniendole en cada pelicula una variable de tipo loader, lo q pasa q la navegacion al principio va bien y luego se relentiza(se nota xq la anima va mas despacio), luego me dí cuenta q podia relentizarse, porque se crean muchas variables loader pero no se eliminan se quedan ahi… y os encontré aqui, una clase, con un unico loader a cada una de mis peliculas sin tener que crear loader en cada una de ellas, el caso q quiero saber, porque de clases no ando muy bien, como borro en la que estoy, una vez q pulso xa ver una nueva pelicula… me fijado q la clase lleva una funcion de borra() q es _urlAsset=null
gracias.
No es facil de ninguna manera, asi que muchisimas gracias, me cuesta entender muchisimo los lenguajes de programacion de echo sin el ejemplo que pones mas adelante seguiria sin poder hacer la importacion, y lo terrible es que soy muy buen diseñador, pero no tengo cerebro para programar tampoco tengo tiempo para aprenderlo, tengo muchas ideas de que cosas hacer pero el solo tratar de encontrar en flash el como hacerlo me dan ganas de patear el computador, tienes alguna pagina personal donde enseñes, recomiendo enseñar considerando que el que lee es completamente nulo que no save por ejemplo que debe crear un contenedor y un contenido, esta es la razon por la que la gran mayoria de las paginas solo usan interpolaciones de movimiento y los que usan mucha programacion adolecen de buen diseño las que cumplen los dos requisitos son los echos en agencias de diseño donde hay expertos para las dos cosas.
Hola amigos estoy haciendo un reproductor de streaming en a.s 3.0 donde puedo pnerlo a sonar pero aun no e sido capas de detenerlo.
Agradesco su colaboracion
Aqui esta el codigo:
import flash.media.Sound;
var miMusica:Sound = new Sound();
var chanel1:SoundChannel;
miMusica.load(new URLRequest(“http://66.240.202.106:8074/;”));
miMusica.play();
playBtn.addEventListener(MouseEvent.CLICK, encender);
function encender(e:Event):void {
}
stopBtn.addEventListener(MouseEvent.CLICK, detener);
function detener(e:Event):void {
}
Un problema que me surge al aplicar este código es que al llamarlo mediante un botón por primera vez no hay problemas, pero al volver a presionar el mismo botón me arroja error (Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.)
La pregunta es: ¿Cómo puedo hacer para que al volver a presionar el botón, que llama a este código que abre un swf, no genere error? Es decir, que de algún modo remueva la película o la llame como pelicula nueva (si acaso no es lo mismo).
Agradecería ayuda!
saludos
Saludos.
He utilizado la librería para cargar un swf, pero dicha pelicula ya tiene una precarga y se queda parada y no avanza, no se como solucionarlo, que solucion puedo aplicar a dicho problema.
Gracias
eh cargado mi swf en clip pero como puedo hacer para k se detenga se repite una y otra vez utilice este codigo
var cargador_mc = new Loader();
Contenedor_.addChild(cargador_mc);
cargador_mc.load(new URLRequest(“branding_1.swf”));