Actionscript 3.0: Ejemplo básico para cargar imágenes

Actionscript 3.0: Ejemplo básico para cargar imágenes

Etiquetas: Loader URLRequest contentLoaderInfo addEventListener

Uno de los primeros post que escribí, fue "Carga de imágenes y SWF en AS3 con Loader" . Básicamente era una explicación de los diferentes eventos disponibles para trabajar con Loader, y de como añadirlos al objeto. Esta es una explicación más "sencilla" de como cargar una imagen, o un SWF en Actionscript.

Lo primero que tenemos que hacer es crear un objeto tipo Loader. Los Loader son los encargados de cargar imágenes (JPG, PNG o GIF) y SWFs en Flash. Esto lo hacemos así:

  1.  
  2.   var loader:Loader = new Loader();
  3.  

Ahora que tenemos un "cargador", hay que pedirle que informe de los eventos de la carga. Hay muchos eventos, pero los principales son tres:

-Error al cargar la imagen (no se encuentra el archivo)

-Progreso de la imagen (nos informa del progreso de la carga)

-Imagen cargada (la imagen ya se ha cargado y podemos trabajar con ella).

Para que el Loader nos informe de estos eventos, tenemos que asociar cada uno a una función. Es decir, debemos decirle: "si la carga falla, ejecuta esta función, y si se carga, ejecuta esta". Esta charla, traducida a Actionscript 3.0 es:

  1.  
  2. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imagenCargada);
  3. loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, imagenError);
  4. loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imagenProgreso);
  5.  

Lo que hemos hecho es "añadir listener de los eventos". Como se puede ver, cada evento vá asociado a una función. El evento Event.COMPLETE, por ejemplo, está asociado a la función "imagenCargada". Estas funciones suelen tener esta apariencia:

  1.  private function imagenCargada(e:Event):void {
  2.   trace("Cargada: " + e);
  3.   addChild(e.target.content);
  4.   }
  5.  
  6.   private function imagenError(e:IOErrorEvent):void {
  7.   trace("Error: " + e);
  8.   }
  9.  
  10.   private function imagenProgreso(e:ProgressEvent):void {
  11.   trace("Cargados=" + e.bytesLoaded + " Total=" + e.bytesTotal);
  12.   } 

Como se puede ver, cada función recibe un parámetro (al que hemos llamado "e", en este caso) que no servirá para obtener información del evento. Por ejemplo, cuando pongamos a cargar la foto, se comenzará a ejecutar periódicamente la función imagenProgreso hasta que termine la carga. Cada vez que Flash ejecute esa función, pasará como parámetro un "e distinto", que contendrá información sobre el progreso de carga en los atributos bytesLoaded y bytesTotal del evento.

Una vez que tenemos añadidos los eventos, tenemos que cargar la imagen mediante la función load:

  1.  
  2.   loader.load( new URLRequest(url));
  3.  

Y listo. El loader que hemos creado se encargará de ejecutar las funciones asignadas a los eventos que le hemos asociado. El evento más importante es Event.COMPLETE, que ejecuta la función imagenCargada cuando el archivo termina de cargarse. Podemos acceder al archivo dentro del parámetro e.target.content den evento.

El código completo, sería el siguiente:


  1. package  
  2. {
  3. 	import flash.display.Sprite;
  4. 	import flash.net.URLRequest;
  5. 	import flash.display.Loader;
  6. 	import flash.events.*;
  7.  
  8. 	public class CargarImagen extends Sprite
  9. 	{
  10.  
  11. 		private var url:String = "circuloPunto.jpg"
  12.  
  13. 		public function CargarImagen():void
  14. 		{
  15. 			var loader:Loader = new Loader();
  16. 			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imagenCargada);
  17. 			loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, imagenError);
  18. 			loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imagenProgreso);
  19. 			loader.load( new URLRequest(url));
  20. 		}
  21.  
  22. 		private function imagenCargada(e:Event):void {
  23. 			trace("Cargada: " + e);
  24. 			addChild(e.target.content);
  25. 		}
  26.  
  27. 		private function imagenError(e:IOErrorEvent):void {
  28. 			trace("Error: " + e);
  29. 		}
  30.  
  31. 		private function imagenProgreso(e:ProgressEvent):void {
  32. 			trace("Cargados=" + e.bytesLoaded + " Total=" + e.bytesTotal);
  33. 		}
  34.  
  35. 	}
  36.  
  37. }

Descargar archivos

Comentarios
    • Autor
    • buub
    Hola esedeerre, acabo de ver tu código, y desde mi escaso conocimiento de as3, más o menos lo entiendo, porque lo explicas de pm, pero me da un error "1037: los paquetes no se pueden anidar". Lo que he hecho es copiar el código a un frame vacío, y dentro lo que deseo es cargar un swf (que lo pongo en la linea "private var url:String = "miSwf.swf" ") que será mi web (un cargador que me gustaría poder animar, en plan se rellena un contorno y luego desaparece para que salga la web). Por favor si me puedes decir algo te lo agradecería. Muchas gracias de antemano.
    • Autor
    • esedeerre

    Hola buub, el código que yo adjunto es de una clase. Lo mejor es que descargues los archivos fuente para ver como está organizada la cosa

    • Autor
    • buub
    Gracias tio, hice lo que me dijiste (veo ya el funcionamiento) pero no me sale lo que necesito, dado que el swf que quiero cargar esta hecho con el flash 8, y no sale. De todas formas gracias.
    • Autor
    • paco
    Qué onda mi buen esedeerre super cool tu tuto, primero felicidades por los grandes aportes., ando divagando en esto del As3, pero con lo que explicas me parece muy práctico, ya que en As2 los sitios que he hecho los he trabajado con precargas cargando swf externos, en este caso te hace la precarga de un jpg pero cambie la ruta para un swf y jalo bien, nada mas que hay cosillas que no entiendo aun, no tienes por ahí algo entre tu cosas con swf ? Lo que quiero hacer es una llamada con un botón a otro swf externo., no sé si también me puedes recomendar alguna lectura con As3 . Me gusta mucho este rollo del Fl pero también me siento en parte un poco tonto en cuanto As3 Gracias por los grandes aportes
    • Autor
    • elisa
    Gracias, por fin encuentro algo sobre as3 que medioentiendo. Me quedé en flash 8 y ahora tengo que reciclarme. Quiero hacer lo mismo que paco.LLamar con un botón a un swf y que lo cargue en un clip vacío. Gracias
    • Autor
    • Mostaza de Canela
    ¿Sabes si existe alguna manera de interrumpir una carga que ya esté iniciada en el objeto loader? Me sucede que estoy cargando una imagen, decido ver otra distinta, pero parece que prima el proceso de carga de la primera, que es la que finalmente se muestra, en vez de la segunda que he pinchado.
    • Autor
    • Mostaza de Canela
    ¿Sabes si existe alguna manera de interrumpir una carga que ya esté iniciada en el objeto loader? Me sucede que estoy cargando una imagen, decido ver otra distinta, pero parece que prima el proceso de carga de la primera, que es la que finalmente se muestra, en vez de la segunda que he pinchado.
    • Autor
    • Eduard
    Sencillez y eficacia. No obstante, y espero que no te lo tomes a mal, convendria que utilizaras efectos visuales, como un progreso y un efecto a la hora de mostrar la imagen. ¿Conoces la clase BulkLoader? Aunque es muy profunda, sus resultados son realmente buenos a la hora de cargar archivos externos.
    • Autor
    • vayven
    Hola, suelto aquí una pregunta a ver si podeís ayudarme. Cargo una imagén con este código:
    gt1.addEventListener(MouseEvent.MOUSE_DOWN, gt1c);
    function gt1c(event:MouseEvent):void{
    var banner:flash.display.Loader=new flash.display.Loader();
    banner.load(new URLRequest("g1.swf"));
    addChild(banner);
    }
    
    tengo estas capas en este orden:
    
    ActionScript
    Thumbnails
    Botones
    Banner
    
    El problema es:
    
    Cargo la imagen en banner y la capa botones, que está justo encima desaparece, 
    los botones no se ven (funcionan con este codigo, pero no creo que sea eso ya 
    que no se ven ni con el alpha 10 inicial que tienen)
    
    actionp.addEventListener(MouseEvent.MOUSE_OVER, a);
    function a(event:MouseEvent):void {
    actionp.alpha=actionp.alpha+90;   
    }
    actionp.addEventListener(MouseEvent.MOUSE_OUT, aa);
    function aa(event:MouseEvent):void {
    actionp.alpha=actionp.alpha-90;   
    }
    
    Un saludo y a ver si me podeis ayudar.
    • Autor
    • vayven
    Vaya, siento la parrafada, no sabía que los saltos de linea no se guardaban...
    • Autor
    • vayven
    Vale, definitivamente pido perdón de nuevo. Ya solucioné mi problema. addChild(banner)->addChildAt(banner, 1); donde 1 es el indice en el eje Z Un saludo!!
    • Autor
    • esedeerre

    @vayven => no tienes que pedir perdon!!!. Lo de los comentarios es fallo mio, está bastante cutre el módulo de comentarios, este verano a ver si rehago la web entera de forma "decente".

    A parte de lo de las profundidades, ten en cuenta que en AS3 el alpha va de 0 a 1, y no de 0 a 100 como en AS2. Es decir que un alpha de 10 en as2 , en un alpha de 0.1 en as3.

    • Autor
    • esedeerre

    @vayven => no tienes que pedir perdon!!!. Lo de los comentarios es fallo mio, está bastante cutre el módulo de comentarios, este verano a ver si rehago la web entera de forma "decente".

    A parte de lo de las profundidades, ten en cuenta que en AS3 el alpha va de 0 a 1, y no de 0 a 100 como en AS2. Es decir que un alpha de 10 en as2 , en un alpha de 0.1 en as3.

    • Autor
    • Yolanda
    Gracias! me ha venido genial! Saludos. Yolanda
    • Autor
    • jaime silva
    estoy estudiando carga de swf en una posicion especifica, en pocas palabras lo que se lograba en as2 con loadMovieNum, loadMovie, podrias ayudarme? Entiendo que es con la clase sprite pero no tengo ni idea de su uso. Gracias por tu tiempo.
    • Autor
    • Ayslin
    Hola, gracias por el ejemplo esta muy bueno. Disculpa que haga una pregunta tan tonta pero no entiendo mucho cómo funciona flash. Bajé los archivos fuente y funcionan super bien, pero cuando intente replicarlos no funcionó, incluso copie tal cual el as3 y aparece el sigte mensaje "llamada a un método addFrameScript posiblemente no definido". Me fijé que el fla tiene en sus propiedades el nombre de la clase, en "clase de documento", así que hice lo mismo, y nada. Me fije también que el "cargarImagen" no tiene nada en "acciones". ¿qué paso falta para que funcione?
    • Autor
    • jose
    hola querría saber cómo cargar varias imágenes. Se que es una pregunta de principiante total, pero así me encuentro yo, empezando. Gracias, muy buen aporte
    • Autor
    • elena
    Estoy aprendiendo as3 y cada vez me doy cuenta que de está muy mal desarrollado. Esta clase me hace pensar que as3 es una "caquita", as3, no tu blog que me encanta. Acaso no está desarrollado en condiciones el pasar las propiedades a la clase una vez instanciada?, es decir, la clase que has creado sirve para cargar una foto con un nombre ya dado, para que sirve eso?
    • Autor
    • JA
    Hola esedeerre, Utilizo tu código para cargar imágenes desde otra web y al ejecutar mi SWF desde el disco duro funciona sin problemas. Pero cuando subo el SWF a mi servidor, deja de funcionar. La carga de cada imagen se inicia, y el ProgressEvent me dice que llega al 100%, pero no llega a completarse. He pensado que podría ser un problema de seguridad o de permisos. ¿Se te ocurre cuál puede ser el problema? ¡Muchas gracias!
    • Autor
    • Lorena
    Bueno estoy modifcando unos archivos de ASP2 a ASP3 y al cargar una rchivo SWF trato de modificarlo con el codigo que me muestras y no me sale nada, el codigo q tengo en ASP2 es el sgte: on (release) { gotoAndStop("1"); unloadMovieNum(1); loadMovieNum("historias.swf", 1); } como lo puedo modificar al ASP3, espeor su ayuda muy pronto
    • Autor
    • consa
    Que tal esedeerre,eh encontrado tu publicacion, es bastante buena (y como desconozco totalmente AS3 pues imagina), el caso es que necesito crear un tipo de simulador en donde debo de cargar dinamicamente las imagenes desde el servidor con php para que a estas le pueda cambiar el color, ya sea de fondo el el color de la misma imagen, esto con el fin de simular un vinilo aderido a la pared; Asi que si me puedes hechar la mano estare agradecido
Dejar un comentario
Tu nombre (obligatorio):

E-mail (obligatorio, no se mostrará):

Web:

Comentario: