Home » AS3 »Class » Currently Reading:

Clase para cargar contenido externo en Actionscript 3

enero 14, 2008 AS3, Class 15 Comments
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:

  1. package com.zguillez.display
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.display.Loader;
  5.     import flash.net.URLRequest;
  6.     import flash.events.Event;
  7.     import flash.events.EventDispatcher;
  8.     //-----------------------------------------
  9.     public class Contenedor extends Sprite
  10.     {
  11.         public static  var CARGADO:String = "cargado";
  12.         private var _clip:Sprite = new Sprite();
  13.         private var _cargado:Boolean = false;
  14.         private var _content:Sprite;
  15.         private var _urlAsset:String;
  16.         //-----------------------------------------
  17.         public function Contenedor(asset:String=null)
  18.         {
  19.             _urlAsset = asset;
  20.             if (_urlAsset != null) {
  21.                 iniLoad();
  22.             }
  23.         }
  24.         //-----------------------------------------
  25.         private function iniLoad(asset:String=null):void
  26.         {
  27.             var loader:Loader = new Loader();
  28.             var request:URLRequest = new URLRequest(_urlAsset);
  29.             loader.load(request);
  30.             var dispatcher:EventDispatcher = loader.contentLoaderInfo;
  31.             dispatcher.addEventListener(Event.INIT, registraContenido);
  32.             addChild(loader);
  33.         }
  34.         //-----------------------------------------
  35.         public function set asset(a:String):void
  36.         {
  37.             if (_urlAsset != null) {
  38.                 removeChild(_clip);
  39.             }
  40.             _urlAsset = a;
  41.             iniLoad();
  42.         }
  43.         //-----------------------------------------
  44.         public function get clip():Sprite
  45.         {
  46.             return _clip;
  47.         }
  48.         public function get cargado():Boolean
  49.         {
  50.             return _cargado;
  51.         }
  52.         //-----------------------------------------
  53.         public function registraContenido(e:Event):void
  54.         {
  55.             _cargado = true;
  56.             _clip = e.target.content;
  57.             dispatchEvent(new Event(Contenedor.CARGADO));
  58.         }
  59.         //-----------------------------------------
  60.     }
  61. }

Su uso es muy simple:

  1. import com.zguillez.display.Contenedor;
  2.  
  3. var cont:Contenedor = new Contenedor();
  4. cont.asset = "pelicula.swf"

Y para detectar la carga completa:

  1. cont.addEventListener(Contenedor.CARGADO, listo);
  2. function listo(e:Event):void
  3. {
  4.     trace("carga lista")
  5. }

Hay que decir que tambien tiene la posibilidad de cambiar el contenido simplemente asignándole otra ruta:

  1. cont.asset = "pelicula2.swf"

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 😉

Compártelo:

Clase para cargar contenido externo en Actionscript 3
Visto 27.572 veces

Currently there are "15 comments" on this Article:

  1. Rafeo dice:

    Muy buena clase Zguillez!! Bastante útil y práctica. Muchas gracias. (Y)

  2. Bleend dice:

    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)

  3. […] 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. […]

  4. Carolina dice:

    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!

  5. admin dice:

    @Carolina: Mira, te monté un .FLA de ejemplo para que veas como funciona:

    http://www.codigoactionscript.org/files/class-contenedor.zip

  6. Andrés dice:

    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 !

  7. Martin dice:

    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

  8. Daniel dice:

    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.

  9. misha dice:

    Hola.

    una pregunta, se puede usar los objetos de libreria del swf cargado dentro de flex ?

    si se puede como se hacen?

    Gracias

  10. adriana dice:

    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.

  11. Boris Rojas dice:

    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.

  12. juan mejia dice:

    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 {

    }

  13. 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

  14. ivan85 dice:

    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

  15. Jorge dice:

    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”));

Comment on this Article:








Twitter: zguillez

AdvertisementAdvertisementAdvertisementAdvertisement

Recibe las novedades por email



Map

Ranking

Codigoactionscript.org: 4.65 sobre 5 (106 valoraciones)

twitter-widget.com