Foros del Web » Creando para Internet » Flash y Actionscript »

Crear botones con texto en bucle for

Estas en el tema de Crear botones con texto en bucle for en el foro de Flash y Actionscript en Foros del Web. Hola, buenas. A ver si alguien puede ayudarme porque a mi ya no se me ocurre. La cuestión es que estoy creando una aplicación en ...
  #1 (permalink)  
Antiguo 29/06/2010, 05:54
 
Fecha de Ingreso: agosto-2009
Mensajes: 35
Antigüedad: 14 años, 7 meses
Puntos: 0
Crear botones con texto en bucle for

Hola, buenas. A ver si alguien puede ayudarme porque a mi ya no se me ocurre.

La cuestión es que estoy creando una aplicación en flash que carga su contenido a través del xml y también los botones que acceden al contenido propiamente dicho.

El problema llega en el estado sobre de estos botones ya que cada uno de ellos tienen un texto que se carga a través de un nodo del xml. Por desgracia, un Simple Button no puede tener dentro un TextField por lo que hay que colocar el botón y el texto en, digamos capas, diferentes (no uno dentro del otro). La cuestión es que si coloco el TextField por encima del boton no puedo hacer clic en el botón y si coloco el botón por encima de la zona activa, en el estado sobre se me tapa el texto.

Había pensado en hacer un MovieClip en vez de un botón pero el problema es que para hacer un estado sobre o un estado press hay que generarlo mediante una función (MouseEvent.MOUSE_OVER) y como los botones son generados mediante un bucle for no me acepta el listener aunque lo meta dentro de éste.

¿A alguien se le ocurre cómo solucionarlo? A continuación, os paso el código:


Código:
var carga:URLLoader = new URLLoader();
var xmlExterno:XML;
var i:Number=0;
var a:Number=0;
var paginar:Loader=new Loader();
var lista:XMLList;
var loc:Number;
var total:Number;
var peticion:URLRequest=new URLRequest();
peticion.url="pantallas.xml";
carga.load(peticion);
var me:ContextMenu = new ContextMenu();
var contenedor:MovieClip;
me.hideBuiltInItems();
this.contextMenu=me;
stage.stageFocusRect=false;

/*-----------------------Propiedades  botones-------------------------*/
var tipolinea:String=GradientType.LINEAR;
var coloreslinea:Array=[0xFFFFFF,0xFFFFFF];
var alfaslinea:Array=[1,0];
var ratioslinea:Array=[0x00,0xFF];//[radio inicial, radio final]
var spreadMethodlinea:String=SpreadMethod.REFLECT;
//var interp:String = InterpolationMethod.LINEAR_RGB; 
//var focalPtRatio:Number = 0; 
var matrixlinea:Matrix = new Matrix();
var boxWidth:Number=100;
var boxHeight:Number=1;
var boxRotation:Number=Math.PI;
var tx:Number=0;
var ty:Number=0;
matrixlinea.createGradientBox(boxWidth, boxHeight, boxRotation, tx, ty);
var caja:TextField;
var up:Sprite;
var linea:Shape=new Shape();
linea.graphics.beginGradientFill(
	 tipolinea,  
	coloreslinea, 
	alfaslinea,
	ratioslinea,
	matrixlinea,  
	spreadMethodlinea  
  );
var degradado:Shape = new Shape();
degradado.graphics.beginGradientFill(
	 tipolinea,  
	coloreslinea, 
	alfaslinea,
	ratioslinea,
	matrixlinea,  
	spreadMethodlinea  
  );
/*------------------------------------------------------------------------------*/

function cargarXML(event:Event) {
	loc=12;
	xmlExterno=new XML(event.target.data);
	lista=xmlExterno.children();
	total=lista.length();
	trace("Total: "+total);
	trace(lista[i].attribute("nombre"));
	for (i=0; i<total; i++) {//inicio del bloque for

		trace("i: "+i);
		trace("a: "+a);

		caja=new TextField();
		var contenido=lista[i].attribute("nombre");
		trace(contenido);
		caja.autoSize=TextFieldAutoSize.CENTER;
		caja.selectable=false;
		caja.y=loc;
		caja.x=96;
		caja.htmlText="<font color='#000000'><font size='11'><font face='Arial, Helvetica, sans-serif'><font color='#013763'>"+contenido+"</font></font></font></font>";
		loc+=31;
		trace("Loc: "+loc);
		contenedor=new MovieClip();
		var boton:SimpleButton=new SimpleButton  ;
		up = new Sprite();


		up.graphics.beginFill(0xFF9900,1);

		up.graphics.drawRect(0,-8,200,caja.height+12);



		if (i>0||a>0) {
			linea.graphics.drawRect(2, caja.y+2, 200, 1);
			addChild(linea);
		}
		
			
		boton.hitTestState=up;
		boton.enabled=true;
		boton.x=0;
		boton.y=caja.y;
		
		
		degradado.graphics.drawRect(up.x, up.y-7, up.width, up.height);
		boton.overState=degradado;
		boton.useHandCursor=true;
		
		
		cargador.addChild(contenedor);
		contenedor.addChildAt(boton,0);
		contenedor.addChildAt(caja,1);
		
		
		caja.name="caja_"+i+"_"+a;
		boton.addEventListener(MouseEvent.CLICK, ir);
		caja.addEventListener(MouseEvent.CLICK, ir);
		boton.name="boton"+i+"_"+a;
	}//cierre del bucle for
	addChild(paginar);
	paginar.x=202;

	var img:URLRequest=new URLRequest(lista.pelicula[a]);
	paginar.load(img);
	i=0;
	a=0;
}


carga.addEventListener(Event.COMPLETE,cargarXML);
  #2 (permalink)  
Antiguo 29/06/2010, 13:07
 
Fecha de Ingreso: mayo-2010
Ubicación: Argentina
Mensajes: 61
Antigüedad: 13 años, 10 meses
Puntos: 6
Respuesta: Crear botones con texto en bucle for

Hola no sé si te ayudará lo que te voy a decir porque no entiendo bien el código AS3 y tampoco llego a comprender bien lo que estás haciendo pero una técnica que a veces utilizo para hacer este tipo de cosas es usar tantos componentes como necesite, creados dinámicamente en el bucle for, esto sería algo así:



this["myListener"+i]=new Algo;

que sería lo mismo que decir:


this.myListener1=new Algo;
this.myListener2=new Algo;
this.myListener3=new Algo;


Espero que te sirva de algo, saludos
  #3 (permalink)  
Antiguo 30/06/2010, 00:13
 
Fecha de Ingreso: agosto-2009
Mensajes: 35
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Crear botones con texto en bucle for

Intento crear unos botones con Campos de texto dinámicos en el interior (no pueden ser movieclips porque los listener no funcionarían).

Con respecto a tu sugerencia, si lees el código verás que ya se ha hecho.

Código:
caja=new TextField();
		var contenido=lista[i].attribute("nombre");

Código:
contenedor.addChildAt(boton,0);

Etiquetas: botones, bucle
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:46.