Como crear un Menu o Galeria de Miniaturas via XML con ScrollBar
Definir variables inciales
Código ActionScript :
var lista_xml:XML = new XML(); lista_xml.ignoreWhite = true; var cargador_mcl:MovieClipLoader = new MovieClipLoader(); cargador_mcl.addListener(this); var img_w:Number = 125;//Ancho de las imagenes var img_h:Number = 135;//Alto de las imagenes var img_n:Number = 3;//Numero de imagenes que se mostraran var img_s:Number = 10;//Separacion entre las imagenes var gal_x:Number = 50;//Posicion en X de la galeria var gal_y:Number = 100;//Posicion en Y de la galeria
Bueno, creo que todo esta bien claro, pero por si las dudas explico "img_n", esa variable es el numero de thumbs(cajas, miniaturas) que se van a mostrar, por ejemplo si tienes 10 thumbs, img_n determinaria que solo se muestren 3 y con el scroll se puedan mostrar las otras 7, img_n en combinacion con img_w determinan el tamaño de la galeria, cuando hagas pruebas cambia el valor de img_n para que veas que sucede.
Crear la Galeria
Código ActionScript :
var galeria:MovieClip = this.createEmptyMovieClip("galeria", 120); galeria.createEmptyMovieClip("miniaturas", 0); galeria.createEmptyMovieClip("mascara", 1); galeria.mascara.beginFill(0,0); galeria.mascara.moveTo(0,0); galeria.mascara.lineTo((this.img_w + this.img_s) * this.img_n, 0); galeria.mascara.lineTo((this.img_w + this.img_s) * this.img_n, this.img_h); galeria.mascara.lineTo(0, this.img_h); galeria.mascara.endFill(); galeria.miniaturas.setMask( galeria.mascara ); galeria._x = this.gal_x; galeria._y = this.gal_y;
Simplemente se crean los movieclips que contendran la galeria y la mascara, "beginFill" "lineTo" son funciones de la api de dibujo de los movieclips con las cuales creo un cuadrado en las mascara del tamaño justo para que solo se vean el numero de imagenes indicado en las variables inciales y posiciono la galeria.
Crear ScrollBar
Código ActionScript :
var slider:MovieClip = galeria.createEmptyMovieClip("slider", 2); slider.beginFill(0xFFCC33,100); slider.moveTo(0,0); slider.lineTo(this.img_w/2, 0); slider.lineTo(this.img_w/2, 20); slider.lineTo(0, 20); slider.endFill(); slider._y = this.img_h + 5; slider.onPress = function( Void ) { this.startDrag(false,0,this._y,this._parent.mascara._width - this._width, this._y); } slider.onRelease = function( Void ) { this.stopDrag(); } slider.onEnterFrame = function() { this._parent.miniaturas._x = this._x / (this._parent.mascara._width - this._width) * (this._parent.miniaturas._width - (this._parent.mascara._width - this._parent._parent.img_s)) * -1; }
Creo el movieclip que contendra la scrollbar, dibujo un cuadrado que sera la representacion y defino los metodos que arrastraran la scrollbar, en el evento OnEnterFrame, evaluo la posicion de la scrollbar y con unos calculos obtengo la nueva posicion de las imagenes que han sido enmascaradas.
Cargar XML
Código ActionScript :
lista_xml.onLoad = function( ok:Boolean ) { if( ok )//Si se cargo correctamente { crearImagenes(); } else trace("No se pudo cargar el XML"); } lista_xml.load("lista.xml");
Simplemente le decimos al objeto XML que debe cargar y agregamos su evento onLoad que indica cuando se ha cargado correctamente, lista.xml es una archivo ubicado en la misma carpeta que el SWF, dicho XML debe estar formado de la siguiente manera:
Código XML :
<?xml version="1.0" encoding="UTF-8"?> <galeria> <img nom_xml="IMG/img1.jpg" url_xml="http://www.cristalab.com" /> <img nom_xml="IMG/img2.jpg" url_xml="http://www.google.com" /> <img nom_xml="IMG/img3.jpg" url_xml="http://www.w3c.es" /> <img nom_xml="IMG/img4.jpg" url_xml="http://www.adobe.com" /> </galeria>
En realidad las etiquetas "galeria" e "img", tienen nombres depreciables osea pueden ser cualquiera, pero elegi esos para que se entienda, el atributo "nom_xml" contiene la ruta de la imagen que se va a cargar y si el atributo "url_xml" existe o es diferente de ""(cadena vacia), entonces sera la url que se cargara al presionar sobre la imagen.
Crear las imagenes
Código ActionScript :
function crearImagenes( Void ):Void { //Variables auxiliares var aux:MovieClip; var img_aux:String; var url_aux:String; for( var i:Number = 0, l:Number = lista_xml.firstChild.childNodes.length; i < l; i++) { aux = this.crearImagen( i ); url_aux = lista_xml.firstChild.childNodes[i].attributes.url_xml; img_aux = lista_xml.firstChild.childNodes[i].attributes.nom_xml; //Aqui se indica que al presionar el boton se carge la url if( url_aux != undefined && url_aux != "" ) { aux.boton_mc.url = url_aux; aux.boton_mc.onRelease = function( Void ) { getURL( this.url ); }; } cargador_mcl.loadClip( img_aux, aux.thumb_mc ); } } function crearImagen( index:Number ):MovieClip { //Clips var clip:MovieClip = this.galeria.miniaturas.createEmptyMovieClip("mc_" + index, index); clip.createEmptyMovieClip("boton_mc", 1) clip.createEmptyMovieClip("thumb_mc", 0) //Posicion clip.index = i; clip._x = (this.img_w + this.img_s) * index; //Fondo transparente del boton clip.boton_mc.beginFill(0,0); clip.boton_mc.moveTo(0,0); clip.boton_mc.lineTo(this.img_w,0); clip.boton_mc.lineTo(this.img_w, this.img_h); clip.boton_mc.lineTo(0, this.img_h); clip.boton_mc.endFill(); return clip; }
La primer funcion "crearImagenes", sirve para "parsear"(analizar y obtener informacion) el objeto XML, asignar valores al boton y cargar las imagenes, ademas de invocar a la segunda funcion "crearImagen" la cual se encarga de crear el movieclip contenedor y posicionarlo deacuerdo al indice que se le pasa como parametro, dicho contenedor tendra la imagen y dibujara un cuadrado transparente que es el que sera usado como boton.
Los eventos del cargador
Código ActionScript :
function onLoadInit( target:MovieClip ) { target._width = this.img_w; target._height = this.img_h; }
Pues estos eventos solo se encargan de redimensionar los clips con respecto a las variables inciales.
FIN
Codigo completo para CopyPaste
Código ActionScript :
//--Definir variables inciales --// var lista_xml:XML = new XML(); lista_xml.ignoreWhite = true; var cargador_mcl:MovieClipLoader = new MovieClipLoader(); cargador_mcl.addListener(this); var img_w:Number = 125;//Ancho de las imagenes var img_h:Number = 135;//Alto de las imagenes var img_n:Number = 3;//Numero de imagenes que se mostraran var img_s:Number = 10;//Separacion entre las imagenes var gal_x:Number = 50;//Posicion en X de la galeria var gal_y:Number = 100;//Posicion en Y de la galeria //-- Crear la galeria --// var galeria:MovieClip = this.createEmptyMovieClip("galeria", 120); galeria.createEmptyMovieClip("miniaturas", 0); galeria.createEmptyMovieClip("mascara", 1); galeria.mascara.beginFill(0,0); galeria.mascara.moveTo(0,0); galeria.mascara.lineTo((this.img_w + this.img_s) * this.img_n, 0); galeria.mascara.lineTo((this.img_w + this.img_s) * this.img_n, this.img_h); galeria.mascara.lineTo(0, this.img_h); galeria.mascara.endFill(); galeria.miniaturas.setMask( galeria.mascara ); galeria._x = this.gal_x; galeria._y = this.gal_y; //-- Crear ScrollBar --// var slider:MovieClip = galeria.createEmptyMovieClip("slider", 2); slider.beginFill(0xFFCC33,100); slider.moveTo(0,0); slider.lineTo(this.img_w/2, 0); slider.lineTo(this.img_w/2, 20); slider.lineTo(0, 20); slider.endFill(); slider._y = this.img_h + 5; slider.onPress = function( Void ) { this.startDrag(false,0,this._y,this._parent.mascara._width - this._width, this._y); } slider.onRelease = function( Void ) { this.stopDrag(); } slider.onEnterFrame = function() { this._parent.miniaturas._x = this._x / (this._parent.mascara._width - this._width) * (this._parent.miniaturas._width - (this._parent.mascara._width - this._parent._parent.img_s)) * -1; } //-- Carga XML --// lista_xml.onLoad = function( ok:Boolean ) { if( ok )//Si se cargo correctamente { crearImagenes(); } else trace("No se pudo cargar el XML"); } lista_xml.load("lista.xml"); //-- Crear las imagenes --// function crearImagenes( Void ):Void { //Variables auxiliares var aux:MovieClip; var img_aux:String; var url_aux:String; for( var i:Number = 0, l:Number = lista_xml.firstChild.childNodes.length; i < l; i++) { aux = this.crearImagen( i ); url_aux = lista_xml.firstChild.childNodes[i].attributes.url_xml; img_aux = lista_xml.firstChild.childNodes[i].attributes.nom_xml; //Aqui se indica que al presionar el boton se carge la url if( url_aux != undefined && url_aux != "" ) { aux.boton_mc.url = url_aux; aux.boton_mc.onRelease = function( Void ) { getURL( this.url ); }; } cargador_mcl.loadClip( img_aux, aux.thumb_mc ); } } function crearImagen( index:Number ):MovieClip { //Clips var clip:MovieClip = this.galeria.miniaturas.createEmptyMovieClip("mc_" + index, index); clip.createEmptyMovieClip("boton_mc", 1) clip.createEmptyMovieClip("thumb_mc", 0) //Posicion clip.index = i; clip._x = (this.img_w + this.img_s) * index; //Fondo transparente del boton clip.boton_mc.beginFill(0,0); clip.boton_mc.moveTo(0,0); clip.boton_mc.lineTo(this.img_w,0); clip.boton_mc.lineTo(this.img_w, this.img_h); clip.boton_mc.lineTo(0, this.img_h); clip.boton_mc.endFill(); return clip; } //-- Eventos del Cargador --// function onLoadInit( target:MovieClip ) { target._width = this.img_w; target._height = this.img_h; }
Suerte a todos.