Flas 8 slideShow.

En este ejemplo, veremos como gracias a la clase Tween (Flash 8 ) y movieClipLoader este proceso puede ser limpio y sencillo, sin necesidad de utilizar complicadas funciones.

Ejemplo
Antes de pasar a ver el código, un ejemplo de lo que vamos a conseguir.

This movie requires Flash Player 8

Importar la clase de Flash 8 Tween

Actionscript:
  1. import mx.transitions.Tween;
  2. import mx.transitions.easing.*;

Declarar variables

Como siempre, para mayor claridad, se declaran las variables al principio.

XML:
  1. var my_xml:XML = new XML ();
  2. my_xml.ignoreWhite = true;
  3. var time:Number = 5;
  4. var urls:Array = new Array ();
  5. var prevMovie:String;
  6. var index:Number = 0;
  7. var depth:Number = 0;

Cargar XML

Se pobla un array urls con los datos obtenidos de un archivo data.xml Ver xml

Una vez se ha terminado el proceso de leer XML y poblar el array, se llama a la función loadImages en intérvalos de tiempo, estos están supeditados al valor de la variable time. En el ejemplo, las imágenes tendran una rotación de 5 segundos (tiempo * 1000)

Actionscript:
  1. my_xml.onLoad = function (success) {
  2.     if (success) {
  3.         for (var i = 0; i <this.firstChild.childNodes.length; i++) {
  4.             urls.push (this.firstChild.childNodes[i].attributes.url);
  5.         }
  6.                 // - - primera imagen
  7.         loadImages ();
  8.         intervalId = setInterval (_root, "loadImages", time * 1000);
  9.     } else {
  10.         trace ("Error al cargar el archivo");
  11.     }
  12. };
  13. //
  14. my_xml.load ("data.xml");

Procesar registros

Se utiliza la variable prevMovie para almacenar el nombre de la imagen que se visualiza actualmente, de forma que al cargar la siguiente, disponemos del nombre de instancia de película cargada para borrar.

Cuando el archivo se ha descargado completamente, se crea una instancia de la clase Tween (para efecto desvanecimiento) y al mismo tiempo, aprovechando los métodos de la clase Tween, se detetecta el fin de la transición (cuando _alpha==100) para descargar la imagen anterior.

Actionscript:
  1. loadImages = function ():Void {
  2.     prevMovie = currentMovie;
  3.     currentMovie = this.createEmptyMovieClip ("currentMovie" + depth, depth);
  4.     var mclListener:Object = new Object ();
  5.     mclListener.onLoadComplete = function (target_mc:MovieClip) {
  6.         var tween_handler:Object = new Tween (target_mc, "_alpha",
  7.         Strong.easeOut, 0, 100, 3, true);
  8.         tween_handler.onMotionFinished = function () {
  9.             unloadMovie (prevMovie);
  10.         };
  11.     };
  12.     var movieClipLoader:MovieClipLoader = new MovieClipLoader ();
  13.     movieClipLoader.addListener (mclListener);
  14.     movieClipLoader.loadClip (urls[index], currentMovie);
  15.     index == urls.length - 1 ? index = 0 : index++;
  16.     depth++;
  17. };

Descarga Slideshow

Slideshow se ha descargado 5,845 veces.

2 Votes | Average: 5 out of 52 Votes | Average: 5 out of 52 Votes | Average: 5 out of 52 Votes | Average: 5 out of 52 Votes | Average: 5 out of 5 (2 votos, promedio: 5 sobre 5)
Loading ... Loading ...

32 Responses to “Flas 8 slideShow.”


  1. 1 santi Jan 7th, 2007 at 6:25 pm

    está genial!!
    ¿Sería muy complicado hacer que cada imagen sea un link? Así al apretar, se abre un .html con la foto más grande o algo así..

  2. 2 elnegromauri Jan 19th, 2007 at 9:08 pm

    Me gustaría posicionar la imagen en un area específica del escenario, que debería modificar para poder lograrlo????

  3. 3 toni Jan 20th, 2007 at 2:10 pm

    Yo lo que hago, es cargar el slideShow en un clip contenedor de esa forma lo puedo manejar a mi antojo. Como lo tengo hecho, te pego el código (que es prácticamente el mismo):

    Actionscript:
    1. //-------------------------------------------------------------------
    2. // declarar variables
    3. //-------------------------------------------------------------------
    4. var my_xml:XML = new XML ();
    5. my_xml.ignoreWhite = true;
    6. var parent:MovieClip = this
    7. var time:Number = 5;
    8. var urls:Array = new Array ();
    9. var prevMovie:String;
    10. var index:Number = 0;
    11. var depth:Number = 0;
    12. slideShow_mc = this.createEmptyMovieClip ("slideShow", this.getNextHighestDepth ());
    13. // --  creo el clip contenedor
    14. slideShow_mc._y = 50;
    15. slideShow_mc._x = 50;
    16. //-------------------------------------------------------------------
    17. // cargar XML
    18. //-------------------------------------------------------------------
    19. my_xml.onLoad = function (success) {
    20.     if (success) {
    21.         for (var i = 0; i <this.firstChild.childNodes.length; i  ) {
    22.             urls.push (this.firstChild.childNodes[i].attributes.url);
    23.         }
    24.         loadImages ();
    25.         intervalId = setInterval (parent, "loadImages", time * 1000);
    26.     } else {
    27.         trace ("Error al cargar el archivo");
    28.     }
    29. };
    30. //
    31. my_xml.load ("empresa_slideshow.xml");
    32. //-------------------------------------------------------------------
    33. // procesar registros
    34. //-------------------------------------------------------------------
    35. loadImages = function ():Void {
    36.     prevMovie = currentMovie;
    37. // creo los clips contenedores dentro de slideShow_mc
    38.     currentMovie = slideShow_mc.createEmptyMovieClip ("currentMovie"   depth, depth);
    39.     var mclListener:Object = new Object ();
    40.     mclListener.onLoadComplete = function (target_mc:MovieClip) {
    41.         var tween_handler:Object = new Tween (target_mc, "_alpha", Strong.easeOut, 0, 100, 3, true);
    42.         tween_handler.onMotionFinished = function () {
    43.             unloadMovie (prevMovie);
    44.         };
    45.     };
    46.     var movieClipLoader:MovieClipLoader = new MovieClipLoader ();
    47.     movieClipLoader.addListener (mclListener);
    48.     movieClipLoader.loadClip (urls[index], currentMovie);
    49.     index == urls.length - 1 ? index = 0 : index  ;
    50.     depth  ;
    51. };

    Saludos

  4. 4 elnegromauri Jan 22nd, 2007 at 11:44 am

    Me gustaría detener el Slideshow por un momento y volverlo a iniciar interactivamente sin volver a cargar el archivo XML con las URLs, como podría yo aislar/separar la rutina que intercambia las imagenes?

    Otro problema que tengo es que las imagenes se colocan siempre en primer plano dentro del escenario, como podría ponerlas bajo un marco (rectángulo transparente con borde de color), que ya está presente (dibujado) en el escenario?

    Muchas gracias por ejemplo anterior ;)

  5. 5 ole Jan 29th, 2007 at 7:08 pm

    Muchas gracias, esto se ve muy bien!!!
    pero tengo una pregunta, como podria independizar el tiempo de duracción de cada imagen?
    gracias,

  6. 6 toni Jan 30th, 2007 at 6:32 am

    Hola,

    Si te refieres a que cada imagen se muestre durante un periodo de tiempo diferente, no se puede debido a que el tiempo lo controla setInterval.

    saludos

  7. 7 atmtc Jan 30th, 2007 at 1:52 pm

    aprovechando el set interval s epodría poner un botón de pausa, no???

  8. 8 toni Jan 30th, 2007 at 2:03 pm

    Si, tambien tendrías que aislar el setInterval dentro de una función para poder reactivarlo.

    Por ejemplo:

    Actionscript:
    1. doInterval = function () {
    2.     intervalId = setInterval (parent, "loadImages", time * 1000);
    3. };
    4. boton.onRelease = function () {
    5.     if (intervalId == undefined) {
    6.         doInterval ();
    7.     } else {
    8.         clearInterval (intervalId);
    9.     }
    10. };

    Saludos

  9. 9 atmtc Jan 30th, 2007 at 11:21 pm

    gracias!!

    lo probaré si consigo leer algún otro tipo de dato del XML, estoy intentando añadirle un titular y un link... pero de momento no consigo que lo lea flash. Se introducen los datos del XML en una matriz nada más entrar en el.FLA porque son links (URLs vamos)

    gracias!!!!

  10. 10 atmtc Jan 31st, 2007 at 12:04 am

    bueno, estoy ofuscado!!!

    cualquier ayuda al respecto será bendecida!

  11. 11 toni Jan 31st, 2007 at 7:44 pm

    Bueno , entonces ya tenemos que hacer unos cuantos cambios, a ver si saco un rato y te pongo un ejemplo.

    saludos

  12. 12 atmtc Jan 31st, 2007 at 7:46 pm

    si puedes, sería enorme!!

    gracias igualmente!! creo que mi problema está en que no soy muy bueno con matrices y no se como llegar a los diferentes atributos del XML

  13. 13 atmtc Feb 6th, 2007 at 1:35 pm

    sin ser pesado ni nada, pero me imagino que nadie ha conseguido alguna novedad, no?

  14. 14 josoroma Feb 15th, 2007 at 12:57 am

    Hola Gente,

    Me gusta este slideshow, como se hace para agregarle un preloader cuando las imagenes no tienen un peso decente.

    Gracias.

  15. 15 josoroma Feb 15th, 2007 at 1:30 am

    De acuerdo a:
    http://www.kadazuro.com/blog/archives/000041.php

    He creado lo siguiente: (pero me falla en la ultima imagen la primera vez, como que se pega un mento y luego se brinca la ultima y pasa otra vez a la primera)


    Stage.scaleMode = "noScale";
    //recibe bytes devuleve kb
    function bytes2kb(val:Number):Number{
    return Math.round(val/1024)
    }
    //holder para el contenido.
    createEmptyMovieClip("holder",1);
    //atachamos el preloader.
    attachMovie("loader","loader",2,{_x:125,_y:150});
    loader.box.autoSize = "right";
    loader.barra._xscale = 1;
    //objeto mcloader
    my_mcl = new MovieClipLoader();
    //listener
    my_mcl_listener = new Object();
    //callback para cuando empieze la carga
    my_mcl_listener.onLoadStart = function(t){
    trace("inicia carga");
    t._visible = false;
    }
    //callback cada vez que se cargue algo
    my_mcl_listener.onLoadProgress = function (t,bl,bt){
    var p:Number = (bl / bt) * 100
    loader.box.text = "cargados: " bytes2kb(bl) " de " bytes2kb(bt) "KB";
    loader.barra._xscale = p;
    }
    //callback en caso de error
    my_mcl_listener.onLoadError = function (t,ec){
    trace("ups! error " ec)
    loader.box.text = ec;
    }
    //callback para cuando se termina la carga.
    my_mcl_listener.onLoadComplete = function(t){
    loader._visible = false;
    t._visible = true;
    trace("fin de la carga.");
    }
    //agregamos el listener al mcloader
    my_mcl.addListener(my_mcl_listener);
    //cargamos la imagen.
    my_mcl.loadClip("saltilloSunset.jpg",holder);
    stop();

  16. 16 josoroma Feb 15th, 2007 at 1:34 am

    perdon el anterior no era el codigo es este:


    /* ------------------------------------------------------------------ */

    /* Tipo de alineacion Top Left para el Stage */
    Stage.align = "TL";

    /* Tamaño del Stage fixed o ajustado sin scalar */
    Stage.scaleMode = "noScale";

    /* ------------------------------------------------------------------ */
    // Importar clase tween
    /* ------------------------------------------------------------------ */

    import mx.transitions.Tween;
    import mx.transitions.easing.*;

    /* ------------------------------------------------------------------ */
    // Declarar variables
    /* ------------------------------------------------------------------ */

    var claseXML:XML = new XML();

    claseXML.ignoreWhite = true;

    /* Para ajsutar el setInterval */
    var tiempo:Number = 6;

    /* Arreglo que contiene los rutaDeImagen o rutas de las imagenes de acuerdo al archivo XML */
    var rutasDeImagenes:Array = new Array();

    var movieAnterior:String;

    var indice:Number = 0;

    var profundidad:Number = 0;

    /* ------------------------------------------------------------------ */
    // Cargar XML
    /* ------------------------------------------------------------------ */

    claseXML.onLoad = function (success) {

    if ( success ) {

    for ( var i = 0; i

  17. 17 Lissa Mar 6th, 2007 at 11:44 pm

    Se podrá agregar 2 botoncitos para que aparte del slide automatico se pueda manejar en forma manual? o sea, volver a una foto anterior, o avanzar varias.
    gracias!

  18. 18 atmtc Mar 7th, 2007 at 11:27 pm

    mhhh tengo un problema!!! he conseguido poner un pequeño texto, un botón de pausa, stop pero hay una problema serio!

    una vez los jpgs se cargan en la cache no los reproduce a la misma velocidad, da igual que yo haya puesto el tiempo de transición a 10 secs, si ya está cargado ( xq antes ya lo hemos cargado p.e.) se lo salta vilmente!

    merci!!!

  19. 19 toni Mar 8th, 2007 at 6:23 am

    Voy a tener que revisar este fla.

  20. 20 atmtc Mar 8th, 2007 at 8:49 pm

    la verdad es que sería la hostia!!
    Yo estoy probando con la clase "cacheManager" pero de momento sólo soy capaz de aplicarlo al xml, no a las imagenes que carga

    http://www.communitymx.com/content/article.cfm?page=2&cid=827EA

  21. 21 toni Mar 8th, 2007 at 8:53 pm

    No creo que sea problema de cache la verdad, me parece que tiene mas que ver el hecho de usar setInterval.

    Te digo algo.

    saludos

  22. 22 atmtc Mar 8th, 2007 at 9:12 pm

    yo lo he mirado en servidor y vamos si no es el setInterval acabará siendo esto, xq la primera vez que carga la imagen no hace nada es la segunda... no se! ojala sea el set Interval y lo saques!

    muchas gracias!

  23. 23 atmtc Mar 9th, 2007 at 12:42 am

    no doy más la vara por hoy, pero el hecho de que sólo pase en servidor y en local chute perfectamente aumenta mis sospechas de que es algo de la cache!

  24. 24 atmtc Mar 9th, 2007 at 12:56 am

    miento dos veces, doy la vara una vez más y en local pasa lo mismo, así que no es nada de la cache!

  25. 25 atmtc Mar 9th, 2007 at 5:47 pm

    confirmado, problema del setInterval!

  26. 26 Jorge López Mar 27th, 2007 at 9:08 am

    Alguien ha encontrado solución al problema de que las imágenes vayan apareciendo cada vez más deprisa y acaba descontrolado??? En mi caso llega un momento en que la imagen se queda fija y ya no rota :(

  27. 27 toni Mar 28th, 2007 at 5:34 am

    Hola Jorge,

    de momento yo no tuve tiempo para mirarlo, lo siento. En cuanto lo solucione, prometo publicarlo.

    Un saludo

  28. 28 atmtc Mar 28th, 2007 at 9:00 am

    la solución es gastarse 20 ¢ de nada aquí www.slideshowpro.net

  29. 29 toni Mar 28th, 2007 at 11:50 am

    Que tipo tan simpático.

  30. 30 kalo Oct 6th, 2007 at 12:08 am

    ya ves menuda mierda ta hecho el prog ese xDDD
    Toni ta cojonudo el slideshow, lo único a saber porke cuando lo cargo dentro de mi pelicula principal mediante un loadmovie, el slideshow no funciona se keda parao en la primera imagen. bueno dudo que alguien responda porke parece ke el post es un tanto antiguo, pero weno, porsiaca!

    salu2

  31. 31 toni Oct 6th, 2007 at 6:45 am

    Hola alo,

    lo que vamos a hacer es lo siguiente:

    En la película que hace el loadMovie tenemos;

    Actionscript:
    1. this.createEmptyMovieClip('holder', this.getNextHighestDepth())
    2. holder.loadMovie('slideShow.swf')

    En la película slideSHow.swf, haremos un pequeño cambio e introduciremos una variable nueva:

    Al principio justo después de las líneas

    Actionscript:
    1. Stage.align = "TL";
    2. Stage.scaleMode = "noScale";

    escribes:

    Actionscript:
    1. var timeLine:MovieClip = this

    y substituyes _'root' por 'timeLine':

    Actionscript:
    1. intervalId = setInterval (timeLine, "loadImages", time * 1000);

    De esta forma no tendrás problemas.

    Un saludo

  32. 32 oblidat Nov 18th, 2007 at 2:57 am

    Hola toni,
    Estupendo tutorial, pero esto del setinterval sigue teniendo problemas cuando se sube al servidor. Si pruebas:

    mclListener.onLoadProgress = function(target_mc, loadedBytes, totalBytes)
    {
    trace(Math.floor((loadedBytes/totalBytes)*100) " %");
    }
    verás que hace cosas raras. Yo he estado probando con el setTimeout però no hay manera. a ver si alguien lo sabe arreglar jeje

Leave a Reply




Subscribe

Subscribe to my RSS Feeds