Google Web after-hours

Contador en flash JSFL Traductor

Dificultad

Cuando tenemos un web que hace uso de muchas imágenes, corremos el riesgo de crear una película demasiado pesada, la solución
pasa por cargar los archivos de imagen externamente, es decir, no están en nuestra biblioteca, sino en una carpeta del servidor y se cargan cuando son necesarias, un ejemplo claro sería un portafolio de un fotógrafo, donde seguramente habrian thumbnails que al ser clicados mostrarí an una ampliación de la imagen. Este ejemplo contempla un caso más sencillo, pero es un primer paso.

Vamos a pasar por varias etapas, cada una de ella completamente funcional y a medida que avanzemos iremos añadiendo funcionalidades nuevas.

Básico:

this.createEmptyMovieClip("cargador",1)
this.cargador._x=0
this.cargador._y=0
this.cargador.loadMovie("../img/robot_flasxl.jpg")

Avanzado:
No está mal, hemos conseguido nuestro principal objetivo, pero podemos mejorarlo si añadimos una precarga

this.createEmptyMovieClip("cargador", 1);
this.createTextField("porcentaje", 2, 0, 0, "200", "16");
this.cargador._x = 0;
this.cargador._y = 0;
this.cargador.loadMovie("../img/robot_flasxl.jpg");
//
this.onEnterFrame = function() {
	this.cargador.percent = (this.cargador.getBytesLoaded()/this.cargador.getBytesTotal())*100;
	if (!isNan(this.cargador.percent)) {
		this.porcentaje.text = Math.round(this.cargador.percent)+" %";
	}
	if (this.cargador.percent == 100) {
		delete this.onEnterFrame;
	}
};

Ya tenemos un cargador de imágenes en toda regla, vamos a mejorar algunos aspectos gráficos, primero añadiremos un marco a la imagen.

this.createEmptyMovieClip("cargador", 1);
this.createTextField("porcentaje", 2, 0, 0, "200", "16");
this.cargador._x = 0;
this.cargador._y = 0;
this.ancho = 300;
this.alto = 366;
this.cargador.loadMovie("../img/robot_flasxl.jpg");
//
with (this) {
	lineStyle(2, 0x000000, 100);
	moveTo(this.cargador._x, this.cargador._y);
	lineTo(this.cargador._x+this.ancho, this.cargador._y);
	lineTo(this.cargador._x+this.ancho, this.cargador._y+this.alto);
	lineTo(this.cargador._x, this.cargador._y+this.alto);
	lineTo(this.cargador._x, this.cargador._y);
}
this.onEnterFrame = function() {
	this.cargador.percent = (this.cargador.getBytesLoaded()/this.cargador.getBytesTotal())*100;
	if (!isNan(this.cargador.percent)) {
		this.porcentaje.text = Math.round(this.cargador.percent)+" %";
	}
	if (this.cargador.percent == 100) {
		delete this.onEnterFrame;
	}
};

Ahora añadiremos un efecto fadeIn, cuando la imagen esté totalmente cargada, aparecerá paulatinamente, para ello usaremos
una función que aumente la propiedad _alpha del clip de película ‘cargador’ desde 0 a 100. Este es resultado final:

//función FX fadeIn
//Previamente hemos asignado el valor 0 al clip de película cargador
alfa = function (clip) {
	this.createEmptyMovieClip("loop", 3);// creamos un clip de pelicula para hacer un loop
	loop.onEnterFrame = function() {
		clip._alpha += 10;
		if (clip._alpha>=100) {
			delete loop.onEnterFrame;// eliminar loop
		}
	};
};
// crear un clip vacio para cargar la imagen
this.createEmptyMovieClip("cargador", 1);
// crear un campo de texto para mostrar el porcentaje cargado de la imagen
this.createTextField("porcentaje", 2, 10, 10, 200, 16);
// situamos el clip de película en la posición que nos conviene
this.cargador._x = 0;
this.cargador._y = 0;
// este es el tamaño de la imagen, nos hace falta paa crear el marco
this.ancho = 300;
this.alto = 366;
// cargar la imagen
this.cargador.loadMovie("../img/robot_flasxl.jpg");
this.cargador._alpha = 0;
// dibujar marco
with (this) {
	lineStyle(2, 0x000000, 100);
	moveTo(this.cargador._x, this.cargador._y);
	lineTo(this.cargador._x+this.ancho, this.cargador._y);
	lineTo(this.cargador._x+this.ancho, this.cargador._y+this.alto);
	lineTo(this.cargador._x, this.cargador._y+this.alto);
	lineTo(this.cargador._x, this.cargador._y);
}
// precarga
this.onEnterFrame = function() {
// calculamos el porcentaje cargado
	this.cargador.percent = (this.cargador.getBytesLoaded()/this.cargador.getBytesTotal())*100;
// mostrar porcentaje
	if (!isNan(this.cargador.percent)) {
		this.porcentaje.text = Math.round(this.cargador.percent)+" %";
	}
// imagen cargada
// cargamos la función para el fx y eliminamos el campo que muestra el porcentaje
	if (this.cargador.percent == 100) {
		this.porcentaje.removeTextField()
		alfa(this.cargador);
		delete this.onEnterFrame;
	}
};

Como he dicho en un principio, cada etapa que hemos pasado es completamente funcional, te aconsejo, que pruebes cada etapa
para entender mejor el funcionamiento. Para visualizar el progreso del campo que muestra el porcentaje, deberás subir el archivo a un servidor, puedes hacerlo en local, pero no verás este valor.

Para evitar la proxicache, substituye :

this.cargador.loadMovie("../img/robot_flasxl.jpg");

por la siguiente línea

this.cargador.loadMovie("../img/robot_flasxl.jpg?id="+random(1000));

Descargar archivos » (6939 hits)

30 Responses to 'Cargar imágenes externas'

  1. Mendi Says:

    Genial, es justo lo que andaba buscando para mi portafolio ;) Parece muy completito.
    Sólo echarí a en falta que hubiese un ejemplo on-line (pa vagos :P )

    Salu2

  2. tonilopez Says:

    Mendi colega! endeluego, al final del articulo se lee:

    Esto es todo, si has llegado hasta aquí , gracias por leerme. Por si me he equivocado en algo, aquí puedes descargarte un ejemplo.

    No seas tan vago y leelo todo!

    ;-)

    Saludos!

  3. jcnd Says:

    Genial, en verdad que me da gusto ver personas que en verdad saben y ademas comparten sus conocimientos con otras personas que pueden o no ser del mismo nivel que vos.

  4. ls2d Says:

    Felicidades por la web, porque creo que es muy interesante. Estare al loro de nuevas noticias.
    Un abrazo!!!!!!!

  5. tonilopez Says:

    Gracias, intentaré que cada visita sea provechosa.
    saludos.

  6. Alfonso Says:

    Muchas gracias por tu ayuda, es genial. Yo no soy muy entendido en Flash así que despues de ver esto me ha surgido una duda ¿cómo puedo colocar la imagen que creo dinámicamente dentro de una capa en especial? es decir, los objetos cargados dinámicamente siempre me quedan encima y yo quiero poder cargar por ejemplo unas imágenes de fondo ¿cómo podrí a hacer esto?

    Muchisimas gracias por vuestra ayuda

  7. Mendi Says:

    Si en lugar de crear el clip cargador con CreateEmptyMovieClip lo creas a mano, y lo pones en la capa del fondo, podrí as conseguirlo.
    Otra opción serí a, por ejemplo, que cargases el resto de elementos con attachMovieClip en niveles superiores al del mc “cargador". Seguro que hay otras formas ;)

  8. juan Says:

    no funciona con gifs transparentes verdad?:-( no hay ninguna forma? Gracias el script es muy bueno.

  9. tonilopez Says:

    Puedes crear 1 swf con cada imagen y usar el mismo fla, solo que en lugar de cargar un JPG cargas un swf, el resultado nadie lo notará.

    Claro está que esto es si tienen que ser gifs, lo recomendable (sobre todo por ahorro de tiempo) es usar JPG.

    Saludos

  10. martha Says:

    hola:

    esta sxuper genial, solo tenia una duda: puedo ponerlo en un boton para q llame a la foto? puedo jalar varias una detras de otra? por favor te agradeceria una ejemplito de descarga

  11. tonilopez Says:

    Hola Martha, puedes usarlo desde un botón, por ejemplo:
    miboton.onRelease=function(){
    clipdepeliculacargador.loadMovie(""nombredelarchivo.jpg");
    }

    saludos

  12. ana Says:

    Hola Toni,

    quiero cargar mis fotos en la web de mejor forma, estoy emigrando a Flash, tengo MX.
    Me encanta el cargador de fotos de www.ciberimagen.com que junto con la carga de cada imagen tiene un seguimiento muy original a la dcha para cada imagen. He pasado por muchos tutoriales, no encuentro algo así .
    He utilizado en www.marsilka.com/Galeria.html un cargador pero quiero algo más sencillo visualmente.
    Saludos, Ana

  13. Toy Says:

    Hola Tonilopez,

    el tutorial genial. Muchas gracias por compartir tu experiencia. :)

    Estoy preparando una web con esta idea cargando imagenes dinámicamente. Para ello difiní una variable a la que llamo “id” y le doy el valor de 1 con lo que consigo que me cargue la imagen “imagen1″.

    // this.cargador.loadMovie("img/imagen"+id+".jpg");

    La idea es poder subir la carpeta del servidor fotos y que se vayan incorporando dinámicamente. Pero tengo 2 problemas que no consigo solucionar:

    1- Me cargan en el vertice superior izquierdo del clip “cargador". Se puede poner como referencia el centro del clip para que salgan centradas tanto si son verticales como horizontales? o como se puede hacer?
    2- A los botones les defino la variable id al princio con id=– y id=++ respectivamente para que vaya abriendo por orden las fotos pero el problema es cuando se acaban las fotos. Como se define unos valores , por ejemplo, entre id=1 y id=10 y si llega a la 10 que vaya al la 1 o que abra un clip que diga FIN ??
    O lo mejor sería que contase automáticamente cuantas imagenes hay y realize lo mismo, no? pero ahí ya no llego .

    Así que aquí dejo este post para ver si consigo avanzar con vuestra ayuda.

    Muchas gracias.

  14. javier urraco pérez Says:

    Hola a todos. Es la primera vez que escribo porque ya estoy deseperadísimo. Me ha venido muy bien el tutorial de cargar imágenes externas a flash. Estoy haciendo una página web con mis trabajos y cuando me carga las fotos me salen superpixeladas y no se porqué, ya que las imágenes las guardo con buena calidad y cuando las veo en mi ordenador se ven muy bien pero en la web no. La página web que estoy haciendo se llama http://personales.ya.com/javierurraco por si kereis verla para comprobar lo que digo. Las secciones en las que de momento he introducido imágenes son la de fotografía e ilustraciones. Ayudadme por favor. OS LO AGRADEZCO

  15. tonilopez Says:

    Yo veo las imágenes muy bien, pero puedes mejorar usando la propiedad ‘_quality’ cuyos valores pueden ser:

    LOW
    MEDIUM
    HIGH
    BEST

    Tambien puedes modificar la calidad de las imagenes que estén en la biblioteca haciendo clic en propiedades, desmarcas la casilla ‘Used imported JPEG data’ y puedes cambiar el nivel de compresión.

    La mejor solución (si trabajas con mapas de bit en la biblioteca) es importar PNG

  16. Aurelio Says:

    Super bueno el Script, sólo me queda una duda. Cómo puedo hacer para que al cliquear el la imagen externa abierta esta se cierre.

    Agradecería una pespuesta

  17. tonilopez Says:

    Escribes:

    cargador.onRelease = function(){
    this.unloadMovie()
    }

    saludos

  18. Juan Says:

    Muy buen ejemplo ….me podrias decir como hacerle para que llame las imagenes…pero a la vez que esta imagen tenga ciertos botones con tooltips …es que estoy haciendo unos mapas geograficos y cada uno de los botones da informacion acerca de unas trampas de insectos ….ya lo eh intentado ….pero el tooltip lo lee abajo de la imagen y eh intentado cambiar de orden las capas ..pero no me resulta….no se si me explique bien ….espero me puedas ayudar!!

  19. tonilopez Says:

    Hola Juan, estaremos encantados de ayudarte, pero deberías dirigir tus preguntas al foro:

    En el foro podrás plantear mejor tu problema y podrás contrastar las opiniones de diferentes flasheros.

    Sobre lo que comentas, no sé hasta que punto entiendo lo que necesitas, pero según lo que me cuentas, lo que tienes que hacer es:

    1. poner una imagen en el escenario (no la cargaria externamente)
    2. Crear un botón movieclip para cada zona sensible
    3. Crear el tooltip

    Te dejo un par de enlaces que te pueden ayudar con esto:

    un buen tooltip
    Por si no has trabajado con moviclips como botones

    Te esperamos en el foro :wink:

  20. Edgar Says:

    y como hago para que la imagen se posicione en el lugar que deseo?

  21. tonilopez Says:

    Si te fijas, la imagen es cargada en un clip de película con nombre de instancia cargador. Lo que tienes que hacer, es modificar las propiedades _x _y de ese clip de película. Por ejemplo:

    this.cargador._x = 100;
    this.cargador._y = 100;

    Esto situará la imagen en _x = 100 _y=100

    Si tienes mas dudas, utiliza el foro

    Saludos

  22. cesar Says:

    Hola. Muchas gracias por este código. Es perfecto. Quería introducir la siguiente mejora. ¿Como podría dar al texto de carga de imágenes el formato, color, tamaño… que quiera? Me hago una idea pero no me sale.

  23. cesar Says:

    Hola. Gracias por el código. ¿Como se asignaría un estilo a las letras del porcentaje?

  24. hector Says:

    hola

    tengo un problema, todo me sale muy bien pero al cambiar de frame me sigue apareciendo la imagen y no quiero que suceda eso, ¡que puedo hacer para que al ir al otro frame desaparezca?.
    gracias

  25. tonilopez Says:

    Hola Hector, como supongo que estarás trabajando con varias capas; en la capa donde cargas las imágenes, en el fotograma donde no quieres que se vea, inserta un fotograma vacio (F5)

    Saludos

  26. iria Says:

    hola!!!

    se que mi duda no tiene nada que ver con este tutorial, pero es que no encuentro el sitio adecuado donde preguntar,

    Resulta que he hecho mi pagina web en un mac con flash MX 2004, y ya esta en la red, si lo abro con un mac se ve bien, pero la gente que lo ha visto con un PC, me dice que el texto se ve todo muy pekeño… lo he hecho mas grandde (a mi ya me parece exagerado) y la gente desde el pc , me sigue diciendo que se ve pekeño, no entiendo nada, será que hay algun tipo de incompatibilidad o que tengo que poner algun codigo de tamaño de letra para que un pc lo lea bien??, es que hasra cambie la fuente por una que fuera mas clara, y nada

    iria

  27. tonilopez Says:

    iria, lo que te ocurre tiene solución. El problema es que yo no trabajo con mac, pero sé que en el foro se ha hablado alguna vez de ello. Te recomiendo que consultes en el foro donde muchos amigos te pueden ayudar.

    Foro: http://www.after-hours.org/foro/

    Un saludo

  28. David Says:

    Hola Toni:

    En primer lugar agradecer a gente como tú la generosidad que demostrais con la comunidad a la hora de razonar y explicar estos códigos.

    En segundo lugar plantearte un pequeño problema para el que no encuentro solución.

    Verás, cargo las imágenes dinámicamente, creo los contenedores de la misma forma, todo perfecto… a excepción… las imágenes provienen de clientes y su tamaño es variable, puedo adaptar dicho tamaño global al tamaño del contenedor?

    Por ejemplo, una imágen puede ir desde los 800x600 a los 1024… etc. pero el espacio reservado para dicha imágen es de 100 px X 100 px… con _xscale e _yscale se vuelve a escapar pues es un escalado sobre un ancho y alto que no es fijo… con _heigth y _width… sólo modifico el contenedor, e incluso he creado una class con una funcíón para el loadmovie dinámico y aplicar allí el height y el width… pero nada… alguna solución? hace tiempo creo recordar que lei algo al respecto…

    Muchas gracias de antemano…

    David Moreno.

  29. tonilopez Says:

    Hola David, puedes hacer lo siguiente:

    this.createEmptyMovieClip("image_mc", this.getNextHighestDepth());
    var mclListener:Object = new Object();
    mclListener.onLoadStart = function(target_mc:MovieClip) {
    target_mc.startTimer = getTimer();
    };
    mclListener.onLoadInit = function(target_mc:MovieClip) {
    target_mc._width = 100;
    target_mc._height = 100;
    };
    var image_mcl:MovieClipLoader = new MovieClipLoader();
    image_mcl.addListener(mclListener);
    image_mcl.loadClip("http://www.after-hours.org/blog/img/top2.jpg", image_mc);

    Saludos

  30. Jack_Royce Says:

    Este codigo es muy bueno ya le hice algunas modificaciones y me esta quedando de lujo, solo q tengo una duda, al querer verlas imagenes en Firefox:

    1.- La cuenta del cargador la deja en 0% y de ahy no se mueve.

    2.- No muestra ninguna imagen.

    En cambio en Explorer las muestra muy bien.

    A q se debera.