[how to] crear un botón con AS3
Hoy me han preguntado cuál es la mejor manera de crear un botón con AS3.
Existen varias soluciones extendiendo directamente de la clase flash.display.Sprite, pero si queremos sacar provecho de la nueva arquitectura, la mejor solución es heredar de la clase flash.display.SimpleButton.
Un ejemplo:
/com/joangarnet/controls/ButtonState.as
-
package com.joangarnet.controls
-
{
-
import flash.display.Sprite;
-
import flash.text.TextField;
-
import flash.text.TextFieldAutoSize;
-
import flash.text.TextFormat;
-
import flash.display.Shape;
-
-
internal class ButtonState extends Sprite
-
{
-
private var btnLabel:TextField;
-
public function ButtonState( color:uint, btnLabelText:String
-
{
-
btnLabel = new TextField ();
-
btnLabel.text = btnLabelText;
-
btnLabel.x = 5;
-
btnLabel.autoSize = TextFieldAutoSize.LEFT;
-
-
var format:TextFormat = new TextFormat ("Verdana");
-
format.size = 10;
-
btnLabel.setTextFormat ( format );
-
-
var btnWidth:Number = btnLabel.textWidth + 10;
-
-
var bkground:Shape = new Shape ();
-
bkground.graphics.beginFill ( color );
-
bkground.graphics.lineStyle ( .25, 0x333333, 1, true );
-
bkground.graphics.drawRect ( 0, 0, btnWidth, 18 );
-
addChild ( bkground );
-
addChild ( btnLabel );
-
}
-
}
-
}
/com/joangarnet/controls/Button.as
-
package com.joangarnet.controls
-
{
-
import flash.display.SimpleButton;
-
-
public class Button extends SimpleButton
-
{
-
public function Button ( btnLabelText:String )
-
{
-
upState = new ButtonState (0xcccccc, btnLabelText);
-
overState = new ButtonState (0xbbbbbb,btnLabelText);
-
downState = new ButtonState (0xaaaaaa, btnLabelText);
-
hitTestState = upState;
-
}
-
}
-
}
/com/joangarnet/controls/ButtonBitmap.as
-
package com.joangarnet.controls
-
{
-
import flash.display.SimpleButton;
-
import flash.display.DisplayObject;
-
-
public class ButtonBitmap extends SimpleButton
-
{
-
[Embed(source="upStateBitMap.png")]
-
private var upStateBitMap:Class;
-
-
[Embed(source="overStateBitMap.png")]
-
private var overStateBitMap:Class;
-
-
[Embed(source="downStateBitMap.png")]
-
private var downStateBitMap:Class;
-
-
public function ButtonBitmap ()
-
{
-
upState = new upStateBitMap() as DisplayObject;
-
overState = new overStateBitMap() as DisplayObject;
-
downState = new downStateBitMap() as DisplayObject;
-
hitTestState = upState;
-
}
-
}
-
}
EjemploBoton.as
-
package
-
{
-
import flash.display.Sprite;
-
import com.joangarnet.controls.Button;
-
import com.joangarnet.controls.ButtonBitmap;
-
import flash.display.StageAlign;
-
import flash.display.StageScaleMode;
-
-
public class EjemploBoton extends Sprite
-
{
-
public function EjemploBoton()
-
{
-
stage.align = StageAlign.TOP_LEFT;
-
stage.scaleMode = StageScaleMode.NO_SCALE;
-
var btn:Button = new Button( "Soy un botón" );
-
btn.x = 25;
-
btn.y = 25;
-
addChild( btn )
-
-
var btn2:ButtonBitmap = new ButtonBitmap();
-
btn2.x = 25;
-
btn2.y = 75;
-
addChild( btn2 )
-
}
-
}
-
}
Podemos asignar cualquier tipo de DisplayObject como estado del botón, como en el ejemplo de ButtonBitmap, que asignamos un *.png embedido.
Comments
21 Responses to “[how to] crear un botón con AS3”
Leave a Reply












Gracias. Me ha resultado muy util. Enhorabuena por el blog.
jooder y todo esto para un botón :-)
cada vez me da más pereza hacer algo en AS3
y eso que me encanta la programación orientada a objetos de verdad y las cosas bien estructuradas, peeeeero
buf
Bueno, siempre nos quedará Flash :)
Supongo que en el CS3 deben haber opciones para creación de botones de la misma forma como se ha hecho hasta ahora.
saludos!
[...] Excelente tutorial en joangarnet sobre cuál es la mejor manera de crear un botón con AS3. [...]
si, en CS3 se puede cambiar perfectamente entre actionscript 1, 2 y 3... como siempre
el interface es una maravilla, merece la pena el cambio
:O !!!!! todo eso para crear un boton!!!!! creo que ahora si el AS3 se me va cada vez mas de las manos, ni modo mejor me dedicare a diseñar solo interfaces en Photoshop....:(
Eso si ... es un buen tutorial
Muuuuy bien, a todos los que no sabíamos más que lo básico en AS2 y queremos aprender AS3 nos viene de perlas.
Gracias por el tutorial, esta bien explicado.
Solo tengo una duda.
Si hago varios botones, como se les cambia la imagen?
porque por lo que veo, no hay opciones para cambiarla.
perdón por no entender pero me puedes explicar por ejemplo mi archivo se llama calendario.pdf
en la acción donde lo sustituyo
mira, creo que lo complicaste mucho como para una serie de botones
Concuerdo con el comentario anterior, muy mal explicado y demasiada complejidad inecesaria.
@luis: No es que lo haya complicado, es que AS3 es así... más complejo.
@juan: Si me argumentas tu comentario te prometo que lo tomaré en cuenta.
Si no lo haces entiendo que la frustración puede causar enfado. Te perdono. XD
Me parece bueno sin embargo no puedo bajar los ejemplos, estoy empesando y serian de gran ayuda, gracias
Ups :S
por alguna razón había desaparecido la carpeta de uploads...
por suerte tenía un backup :)
Gracias por reportar!
a ver si me das una mano, yo veo muy inteligente el codigo que haces, igualmente me cuesta un poco la programación orientada a objetos, soy de la vieja escuela, como podrias pasarle por parametros que cuando hagan el over de ese boton creado dinamicamente se ejecute el over de otro que ya existe o que cambie el color de un objeto grafico, se puede hacer algo asi ? el ejemplo mio es de un mapa, yo quiero que en el rollover del boton creado me pinte por ejemplo una provincia.
Gracias.
Hola, sería así:
btn.addEventListener( MouseEvent.ROLL_OVER, rollOverHandler )
btn2.addEventListener( MouseEvent.ROLL_OVER, rollOverHandler2 )
function rollOverHandler( event:MouseEvent ):void{
trace( "over btn" )
var evt:MouseEvent = new MouseEvent(MouseEvent.ROLL_OVER);
btn2.dispatchEvent( evt );
}
function rollOverHandler2( event:MouseEvent ):void{
trace( "over btn2" )
}
Si quieres que además de ejecutarse el evento se pinte el estado deberías hacer que el botón fuera un MovieClip con los n estados que necesites (up, over, down por ejemplo) definidos en distintos frames y en el segundo roll over hacer algo así:
function rollOverHandler2( event:MouseEvent ):void{
trace( "over btn2" );
btn2.gotoAndStop( "over" );
}
Saludos!
Pero esto del as3 hasta cierto punto como q ya se pasa de complicarse la vida, ya q en as2 con un par de lineas tienes un boton, pero bueno talvez la ignorancia sea atrevida...
Yo siempre he respetado la opinion de los demas pero solo les digo a las personas que dicen que hacer botones ocualquier otro objeto en AS3 es muy complicado les digo en esta vida lo que vale la pena es complicado y hacer objetos dinamicamente vale la pena si de flash se esta hablando pues reduce mucho el tamaño de tu swf y si utilizas xml o rss para crear tus objetos puedes hacer una aplicacion compleja y que el no va a ser muy pesada para el navegador, pues muchos hablan de la usabilidad y este tipo de trabajos resuelven en gran medida ese problema, excelente trabajo amigo sigue asi este tipo de trabajos tienen gran demanda si le das un uso adecuado, felicidades.
Me parece perfecto, pero no se olviden que hay muchas formas de hacer un boton.
Me parece genial esta forma; por que asi aprendes más, aprendes nuevas técnicas, de esta forma te ayuda a resolver otros problemas....
buen aporte.. gracias totales
Hola Joan, estoy probando tu ejemplo porque me parece muy bueno y lo que no se es como Linkar desde flash la clase upStateBitmap ya que cuando ejecuto el programa en flash cs3 me da el siguiente error "Se intentó crear una instancia en un tipo no constructor." Solo me pasa con el boton de las imagenes. Ya que he rebisado el codigo y lo que no entiende justamente son las funciones constructoras
upState = new upStateBitMap() as DisplayObject;
overState = new overStateBitMap() as DisplayObject;
downState = new downStateBitMap() as DisplayObject;
Me puedes echar una mano, porque el archivo en cs3 no lo tendras, para ver si hay que linkar los png con alguna clase que cuelgue de displayObject o algo parecido ....