Comunidad de diseño web y desarrollo en internet online

Distribuir precargas en las miniaturas de una galeria XML

Citar            
MensajeEscrito el 15 Dic 2008 04:00 pm
Hola gente de Cristalab, por aqui sigo con mis dudas de AS3. pasandolo un poco mal con los eventos... hehe.

Bueno a ver, mi idea es hacer una galeria en XML que cargue las miniaturas solo por peticion, es decir que no tenga que cargar las 1000 minis en un clip, enmascararlo y moverlo para arriba y para abajo.

Quisiera paginar las miniaturas y solo cargar las necesarias con un bonito preload individual.

Mi planteamiento es este.... funcion cargar fagina y funcion borar pagina.

El problema al que me enfrento es a la hora de manejar los preloads... como puedo ubicarlos cada uno en su miniatura correspondiente???? no me aclaro muy bien.

El otro problema es a la hora de distribuir las miniaturas ya cargadas por los diferentes clips...

Código :

function cargaXML_OK(e:Event):void
{
   xmlExterno = new XML(cargadorXML.data);
   total_mini = xmlExterno.registro.length();
   no_paginas = Math.ceil(total_mini / (no_columnas * no_filas));
   paginacion_txt.text="Pag " +pagina_actual + " / " + no_paginas;
   for (var i:uint = 0; i < total_mini; i++) {
      idimagen_list.push( xmlExterno.registro[i][email protected]() );
      nombre_list.push( xmlExterno.registro[i][email protected]() );
      fecha_list.push( xmlExterno.registro[i][email protected]() );
      lugar_list.push( xmlExterno.registro[i][email protected]() );
      texto_list.push( xmlExterno.registro[i][email protected]() );
   }
   carga_pagina();
}
function carga_pagina():void
{
   if (id_mini < pagina_actual * (no_columnas * no_filas)) {
      
      var marco_width = 110;
      var marco_height = 75;

      var miniatura_mc:MovieClip = new MovieClip();
      miniatura_mc.graphics.beginFill(0xFFFFFF);
      miniatura_mc.graphics.drawRect( 0, 0, marco_width, marco_height );
      miniatura_mc.graphics.endFill();

      miniatura_mc.name = "mini_" + contenedor.numChildren;
      miniatura_mc.buttonMode = true;
      miniatura_mc.addEventListener( MouseEvent.MOUSE_OVER, sobre_mini );
      miniatura_mc.addEventListener( MouseEvent.MOUSE_OUT, fuera_mini );
      miniatura_mc.addEventListener( MouseEvent.CLICK, click_mini );

      //colocamos los marcos para las miniaturas en el contenedor
      miniatura_mc.x = Math.floor( contenedor.numChildren % no_columnas ) * ( marco_width + separacion_mini );
      miniatura_mc.y = Math.floor( contenedor.numChildren / no_columnas ) * ( marco_height + separacion_mini);
      contenedor.addChild(miniatura_mc);

      var mini_ruta:URLRequest = new URLRequest( carpeta_mini + nombre_list[id_mini] );
      var mini_loader:Loader = new Loader();
      mini_loader.load(mini_ruta);
      mini_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, cargando_mini);
      mini_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, mini_cargado);
      
      trace("cargo"+id_mini);
      id_mini++;
      carga_pagina();
   }
}
function borra_pagina():void
{
   //Borraria la pagina actual y cargara la pagina siguiente llamando a la funcion cargapagina()
}
function cargando_mini(e:ProgressEvent)
{
ME GUSTARIA SABER COMO COLOCAR UN PRELOAD EN LA MINIATURA CORRESPONDIENTE?????
   trace("Cargando "+ e.target)
}
function mini_cargado(e:Event)
{
ME GUSTARIA SABER COMO COLOCAR LA IMAGEN EN SU MINIATURA CORRESPONDIENTE
   trace(e.target.url);
}
function sobre_mini(e:MouseEvent):void
{
   trace("Sobre "+ e.target.name)
}
function fuera_mini(e:MouseEvent):void
{
   trace("Salgo de "+ e.target.name)
}
function click_mini(e:MouseEvent):void
{
   trace("He pinchado sobre "+ e.target.name)
}
cargadorXML.load(rutaXML);
cargadorXML.addEventListener(Event.COMPLETE, cargaXML_OK);
cargadorXML.addEventListener(IOErrorEvent.IO_ERROR, cargaXML_NO);


Se que me falta mucho por desarrolar, pero con distribuir correctamente los preload por los marcos de las miniaturas y las correspondientes imagenes me ayudarias bastante a salir de este agujero en el que me encuentro.

GRACIAS DE ANTEMANO...

Por superloyez

13 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Dic 2008 04:40 pm
Tal y como lo tienes usas varios loaders ¿por qué no añadirlos al miniatura_mc?
Si supongo que tienes

Código ActionScript :

function cargando_mini(e:Event)
  // e.target----> es el contentLoaderInfo
  // ContenLoaderInfo(e.target).loader --->es el loader
  // DisplayObject(ContenLoaderInfo(e.target).loader).parent --->es miniatura_mc
}

Otra opción pasaría por tener un único "mini_loader", pero para ello deberías montar la película para que se cargaran los thumbails uno a uno, no como la tienes ahora.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Dic 2008 05:18 pm
Eliseo, por dios... cuanto tiempo.... sigues siendo mi programador salvavidas.... que haria yo sin ti...

Veo que inentas explicarme los comportamientos de los eventos, pero el papafrita de mi no sabe como aplicarlo.... se me escapan varias cosas...

Me propones crear la caja de texto a la par que miniatura... hasta ahi perfecto...

Código :

 
                miniatura_mc.name = "mini_" + id_mini;
      miniatura_mc.buttonMode = true;
      miniatura_mc.addEventListener( MouseEvent.MOUSE_OVER, sobre_mini );
      miniatura_mc.addEventListener( MouseEvent.MOUSE_OUT, fuera_mini );
      miniatura_mc.addEventListener( MouseEvent.CLICK, click_mini );
      
      var preload_txt:TextField=new TextField();
      preload_txt.name="preload_" + id_mini;
      preload_txt.x=30;
      preload_txt.y=30;
      miniatura_mc.addChild(preload_txt);
      //colocamos las miniaturas en el contenedor
      miniatura_mc.x = Math.floor( contenedor.numChildren % no_columnas ) * ( marco_width + separacion_mini );
      miniatura_mc.y = Math.floor( contenedor.numChildren / no_columnas ) * ( marco_height + separacion_mini);
                contenedor.addChild(miniatura_mc);


Eso lo entiendo, pero luego en la funcion cargando como escribo en esas cajas de texto el porcentaje...

Código :

function cargando_mini(e:ProgressEvent)
{
   var bCargados:Number = e.bytesLoaded;
   var bTotales:Number = e.bytesTotal;
   var por:Number = Math.round(bCargados * 100 / bTotales);
   QUE HABRIA QUE PONER AQUI="Cargando " + por + "%";
}


TENGO EL MISMO PROBLEMA PARA REFERIRME A LAS MINIATURAS EN LA FUNCION mini_cargado.

Gracias tio, eres mi salvador...

Por superloyez

13 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Dic 2008 05:44 pm
Te decía que el loader mismo lo pongas DENTRO de miniatura_mc.
miniatura_mc es un MC (no se valen tirar piedras) luego podemos meter dentro todo lo que queramos. Al final la idea es tener VARIOS MCs del tipo

Código :

mini_0
    |-------preload_txt
    |-------mini_loader

mini_1
    |-------preload_txt
    |-------mini_loader

mini_2
    |-------preload_txt
    |-------mini_loader


Observa que no cambiamos el nombre de los Objetos interiores. No hay ninguna necesidad y simplifica el problema.
Lo de los eventos no es demasiado difícil de entender. Lo que lo complica todo es la "conversión a cast".
e.target -------->será a quién le hemos asignado el evento.
Observa que le asignamos el evento al "contentLoaderInfo". Bueno, el ContainerLoaderInfo tiene una "propiedad" que es el "loader" de donde procede. Así que
e.target.loader ---->será el loader
Si el loader "pertenece" a los "mini"
e.target.loader.parent -------->será el miniatura_mc
Si preloader_txt pertenece a miniatura_mc
e.target.loader.parent.preloade_txt ------>será nuestro texto

Vale, la cosa NO es tan bonita porque tenemos que usar una "conversión de cast", que significa que el compilador no es capaz de saber que, p.e. e.target es un ContainerLoaderInfo, así que se lo tenemos que decir
ContentLoaderInfo(e.target) -------->será a quién le hemos asignado el evento.
ContentLoaderInfo(e.target).loader ---->será el loader
ContentLoaderInfo(e.target).loader.parent -------->será el miniatura_mc
ContentLoaderInfo(e.target).loader.parent.preloader_txt ------>será nuestro texto

Vale, el compilador ya sabe que loader es un loader y que tiene parent, pero no sabe que el parent es un MovieClip, así que
ContentLoaderInfo(e.target) -------->será a quién le hemos asignado el evento.
ContentLoaderInfo(e.target).loader ---->será el loader
ContentLoaderInfo(e.target).loader.parent -------->será el miniatura_mc
MovieClip(ContentLoaderInfo(e.target).loader.parent).preloader_txt ------>será nuestro texto

Es jodidamente lioso, lo sé, pero Flash10 tampoco lo soluciona

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Dic 2008 02:19 pm
Eliseo... me siento supertonto....

Me leo una y otra vez lo que me explicas, intento aplicarlo pero ninguna de mis combinaciones me funciona.

he intentado hacer un trace con las distintas rutas y algo consigo entender... pero a la hora de aplicarlo me atasco y no avanzo nada con esto... lo siento....

Te cuento lo que he hecho....

Código :

function carga_pagina():void
{
   if (id_mini < pagina_actual * (no_columnas * no_filas)) {

      var marco_width = 110;
      var marco_height = 75;
      
      //CREO MINIATURA_MC
      var miniatura_mc:MovieClip = new MovieClip();
      miniatura_mc.graphics.beginFill(0xFFFFFF);
      miniatura_mc.graphics.drawRect( 0, 0, marco_width, marco_height );
      miniatura_mc.graphics.endFill();
      miniatura_mc.buttonMode = true;
      miniatura_mc.addEventListener( MouseEvent.MOUSE_OVER, sobre_mini );
      miniatura_mc.addEventListener( MouseEvent.MOUSE_OUT, fuera_mini );
      miniatura_mc.addEventListener( MouseEvent.CLICK, click_mini );
      
      //CREO Y COLOCO PRELOAD_TXT DENTRO DE MINIATURA_MC
      var preload_txt:TextField=new TextField();
      preload_txt.x=30;
      preload_txt.y=30;
      miniatura_mc.addChild(preload_txt);
      
      //CREO Y COLOCO EL MINILOADER DENTRO DE MINIATURA_MC
      var mini_ruta:URLRequest = new URLRequest( carpeta_mini + nombre_list[id_mini] );
      var mini_loader:Loader = new Loader();
      mini_loader.load(mini_ruta);
      mini_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, cargando_mini);
      mini_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, mini_cargado);
      miniatura_mc.addChild(mini_loader);
      
      //UBICO MINIATURA_MC EN EL CONTENEDOR
      miniatura_mc.x = Math.floor( contenedor.numChildren % no_columnas ) * ( marco_width + separacion_mini );
      miniatura_mc.y = Math.floor( contenedor.numChildren / no_columnas ) * ( marco_height + separacion_mini );
      contenedor.addChild(miniatura_mc);

      trace("cargo"+id_mini);
      id_mini++;
      carga_pagina();
   }
}


Hasta aqui creo que lo estoy haciendo bien, no???? creo que si.
El problema lo tengo a la hora de rellenar los campos de texto del preload de cada una de las miniaturas_mc.

Código :

function cargando_mini(e:ProgressEvent)
{
   var bCargados:Number = e.bytesLoaded;
   var bTotales:Number = e.bytesTotal;
   var por:Number = Math.round(bCargados * 100 / bTotales);
   /*
   ESTO ES UNA ABERRACION, NO?????? NO ME HE ENTERADO DE NADA....
   */
   MovieClip(contentLoaderInfo(e.target).loader.parent).preloader_txt.text="Cargando " + por + "%";
}


He probado miles de traces y combinaciones posibles y siempre me topo con un metodo ContentLoaderInfo no definido... he probado en minusculas "contentLoaderInfo"... pero me sale lo mismo..... o en el mejor de los casos me sale lo siguiente:

Código :

El objeto de carga no está suficientemente cargado para proporcionar esta información.atflash.display::LoaderInfo/get loader()


Siento no ser mas listo... pero es que por ahi tampoco encuentro nada....

Si alguien pudiera sacarme de este atasco.. le estaria muy agradecido....

Entenderia que la paciencia de Eliseo tenga limite...hehehe

Gracias de antemano...

Por superloyez

13 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Dic 2008 04:11 pm
perdonamé, no hace falta ninguna conversión de cast para los loaders, es simplemente

Código ActionScript :

MovieClip(e.target.loader.parent).preloader_txt.text="Cargando " + por + "%";

NOTA:Si no sale, juro que pruebo un ejemplo

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Dic 2008 06:00 pm
Eliseo, no funciona, lo siento.... te he mandado un mensaje privado con un rar, a ver si lo solucionamos y cuelgo la solucion al problema, esta siendo bastante leido el post y seguro que a mas de uno le vendra bien.

Un saludo y gracias.

Por superloyez

13 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 17 Dic 2008 07:40 am
Parece que existe un problema con los objetos de la clase ProgressEvent y es que no hay modo de hacer referencia al loader. Vamos, algo como

Código ActionScript :

//en un evento Event.INIT
private function mini_cargado(e:Event):void
{
     var mini:MovieClip = MovieClip(e.target.loader.parent);
     var preload:TextField = TextField(mini.getChildByName("preload"))
}
//pero en un evento ProgressEvent.PROGRESS
private function cargando_mini(e:ProgressEvent):void
{
     var mini:MovieClip = MovieClip(e.target.loader.parent); ????
     var bCargados:Number = e.bytesLoaded;
     var bTotales:Number = e.bytesTotal;
     var por:Number = Math.round(bCargados * 100 / bTotales);
}

No entiendo el motivo

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Dic 2008 07:22 am
Bueno, una vez conocido el motivo, la solución pasó por hacer una precarga secuencial, primero un thumbail, luego otro, luego otro... guardando en una variable una referencia al MC donde se está cargando la imagen
NOTA:Te mandé un MP ¿lo leístes?

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Dic 2008 02:43 pm
Eliseo me propuso cambiar la estructura de mi galeria, ya que cargar todas las miniaturas a la vez con un preload individual, por lo visto no es posible...

//SI ALGUIEN SUPIERA COMO ESTARIA MUY BIEN EL APORTE.

Pero en caso de no poderse, cambio la estructura a como me decia Eliseo, pero no funciona.

Como puedo referirme a la imagen que se carga en el loader sin que me de el famoso error...

Código :

ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.


Segun Eliseo, esto esta bien, pero no me funciona

Código :

function mini_cargado(e:Event):void
{
mini_actual.addChildAt(e.target.loader.content,0);
}


Si alguien pudiera echarme una mano, hace mas de una semana que no consigo salir de aqui...

O si alguien quisiera orientarme para poderla hacer con precargas individuales no-secuenciales... le estaria muy agradecido...

Algun ejemplo de la red... algun tutorial... lo que sea....

Eliseo gracias de todos modos... entiendo que tu paciencia tenga limites.... no se si soy muy torpe o k??? pero lo he probado todo...

Por superloyez

13 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Dic 2008 02:49 pm
Te he mandado un MP, pero para quien haya seguido el hilo, el preloader hay que crearlo y añadirlo directamente en la función que creamos la miniatura

Por Eliseo2

710 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.