Bueno ya tengo algo que funciona ahora lo adaptaré a mis necesidades, por si alguien quisiera utilizarlo, aquí se lo dejo:
Código :
class TextoDeslizante {
// anchura del control
private var ancho:Number;
// altura del control
private var alto:Number;
// variable que determina la velocidad de desplazamiento del texto
private var velocidad:Number;
// si es true el texto una vez que ha pasado vuelve a subir
private var repetirIndefinidamente:Boolean;
// variable con el texto presentado en pantalla
private var texto:String;
// variable para cargar archivos xml
private var xml:XML;
// mc en el que se insertara nuestro control
private var padre:MovieClip;
// sera el mc que contenga todo lo demás
private var contenedor:MovieClip;
// mc que contendrá el TextField donde se escribe, tiene que estar en un mc para que se pueda enmascarar
private var capaTexto:MovieClip;
// mc que sirve de máscara para el texto
private var mascara:MovieClip;
// donde se escribirá el texto
private var areaTexto:TextField;
// recuadro que representa el fondo del control
private var fondo:MovieClip;
// formato del texto
private var formatoTexto:TextFormat;
// color del borde del fondo
private var colorBorde:Number;
// grosor del borde del fondo
private var grosorBorde:Number;
// color del fondo
private var colorFondo:Number;
// variables por defecto
private var FORMATO_DEFAULT:TextFormat;
private var COLORFONDO_DEFAULT:Number = 0xECF9FF;
private var COLORBORDE_DEFAULT:Number = 0x0000FF;
private var GROSORBORDE_DEFAULT:Number = 2;
private var VELOCIDAD_DEFAULT:Number = 1;
private var REPETIR_INDEFINIDO_DEFAULT = true;
// Constructor
public function TextoDeslizante(padre:MovieClip, ancho:Number, alto:Number, x:Number, y:Number) {
contenedor = padre.createEmptyMovieClip("contenedor", padre.getNextHighestDepth());
contenedor._x = x;
contenedor._y = y;
this.ancho = ancho;
this.alto = alto;
xml = null;
FORMATO_DEFAULT = new TextFormat();
FORMATO_DEFAULT.color = 0x0000ff;
FORMATO_DEFAULT.align = "center";
FORMATO_DEFAULT.font = "Tahoma";
FORMATO_DEFAULT.bold = true;
FORMATO_DEFAULT.size = 14;
formatoTexto = FORMATO_DEFAULT;
colorBorde = COLORBORDE_DEFAULT;
grosorBorde = GROSORBORDE_DEFAULT;
colorFondo = COLORFONDO_DEFAULT;
velocidad = VELOCIDAD_DEFAULT;
repetirIndefinidamente = REPETIR_INDEFINIDO_DEFAULT;
pintarFondo();
crearRectangulo(ancho - grosorBorde,alto - grosorBorde,mascara);
mascara._x = grosorBorde/2;
mascara._y = grosorBorde/2;
capaTexto = contenedor.createEmptyMovieClip("capaTexto", 3);
// Establecemos la máscara
capaTexto.setMask(mascara);
// le asignamos a capaTexto una referencia a la clase
// para que pueda acceder a sus valores desde los eventos
capaTexto.clase = this;
// Creamos el campo de texto
areaTexto = capaTexto.createTextField("textArea", 1, 0, 0, ancho, alto);
areaTexto.text = "";
texto = areaTexto.text;
areaTexto.setTextFormat(formatoTexto);
areaTexto.multiline = true;
areaTexto.selectable = false;
//areaTexto.autoSize = true;
}
public function cargarXML(xml:XML) {
this.xml = xml;
}
public function iniciarMovimiento() {
if (velocidad<=0) {
velocidad = VELOCIDAD_DEFAULT;
}
capaTexto.onEnterFrame = function() {
this.textArea._y -= this.clase.velocidad;
if (this.textArea._y == (-1)*this.textArea._height) {
if (this.clase.RepetirIndefinidamente) {
this.textArea._y = this.clase.alto;
} else {
this.onEnterFrame = function() {
};
}
}
};
}
public function detenerMovimiento() {
areaTexto._y = 0;
capaTexto.onEnterFrame = null;
}
// variable que determina la velocidad de desplazamiento del texto
public function get Velocidad():Number {
return velocidad;
}
public function set Velocidad(velocidad:Number) {
this.velocidad = velocidad;
}
// para que el texto esté siempre pasando
public function get RepetirIndefinidamente():Boolean {
return repetirIndefinidamente;
}
public function set RepetirIndefinidamente(repetirIndefinidamente:Boolean) {
this.repetirIndefinidamente = repetirIndefinidamente;
}
public function get Padre():MovieClip {
return padre;
}
public function get AreaTexto():TextField {
return areaTexto;
}
public function get Ancho():Number {
return ancho;
}
public function get Alto():Number {
return alto;
}
public function setSize(ancho:Number, alto:Number) {
this.alto = alto;
this.ancho = ancho;
pintarFondo();
mascara = contenedor.createEmptyMovieClip("mascara", 2);
crearRectangulo(ancho, alto, mascara);
// Establecemos la máscara
capaTexto.setMask(mascara);
areaTexto._width = ancho;
}
public function get X():Number {
return contenedor._x;
}
public function set X(x:Number) {
contenedor._x = x;
}
public function set Y(y:Number) {
contenedor._y = y;
}
public function get Y():Number {
return contenedor._y;
}
public function setPosition(x:Number, y:Number) {
contenedor._x = x;
contenedor._y = y;
}
public function set FormatoTexto(formatoTexto:TextFormat) {
if (formatoTexto != null && formatoTexto != undefined) {
areaTexto.setTextFormat(formatoTexto);
areaTexto._height = areaTexto.textHeight+10;
this.formatoTexto = formatoTexto;
}
}
public function get FormatoTexto():TextFormat {
return formatoTexto;
}
public function get ColorFondo():Number {
return colorFondo;
}
public function set ColorFondo(colorFondo:Number) {
this.colorFondo = colorFondo;
pintarFondo();
}
public function get ColorBorde():Number {
return colorBorde;
}
public function set ColorBorde(colorBorde:Number) {
this.colorBorde = colorBorde;
pintarFondo();
}
public function get GrosorBorde():Number {
return grosorBorde;
}
public function set GrosorBorde(grosorBorde:Number) {
if (grosorBorde >= 0) {
this.grosorBorde = grosorBorde;
//Repintamos tambien la mascara para que las letras no atraviesen el borde;
mascara = contenedor.createEmptyMovieClip("mascara",2);
mascara._x = grosorBorde/2;
mascara._y = grosorBorde/2;
crearRectangulo(ancho - grosorBorde,alto - grosorBorde ,mascara);
// Establecemos la máscara
capaTexto.setMask(mascara);
pintarFondo();
}
}
// añadir texto al texto actual
public function addTexto(texto:String) {
this.texto += texto;
areaTexto.text += texto;
areaTexto.setTextFormat(formatoTexto);
areaTexto._height = areaTexto.textHeight+10;
}
// establecer un nuevo texto
public function set Texto(texto:String) {
this.texto = texto;
areaTexto.text = texto;
areaTexto.setTextFormat(formatoTexto);
areaTexto._height = areaTexto.textHeight+10;
}
public function get Texto():String {
return texto;
}
/**
/* Metodos privados
**/
private function crearRectangulo(ancho:Number, alto:Number, mc:MovieClip) {
mc.beginFill(colorFondo);
mc.lineStyle(grosorBorde, colorBorde);
mc.lineTo(0, alto);
mc.lineTo(ancho, alto);
mc.lineTo(ancho, 0);
mc.lineTo(0, 0);
}
private function pintarFondo() {
fondo = contenedor.createEmptyMovieClip("fondo", 1);
crearRectangulo(ancho, alto, fondo);
}
}
Bien esta sería la clase, lo que hace es pintar un recuadro en la pantalla, encima del cual va un textField, quizá el código está algo lioso pero lo he puesto sin espacio entre líneas para que el post ocupe menos.
Cuando se llama al metodo "iniciarMovimiento(); el texto comienza a desplazarse hacia arriba y con el método detenerMovimiento se para y el texto vuelve a colocarse en el principio.
Para cambiar el texto tenemos dos opciones:
1. La propiedad Texto: nos permite reemplazar el texto existente por uno nuevo
2. La funcion addTexto(texto): nos permite añadir texto nuevo al texto existente;
Existen una serie de parámetros para configurar el control:
1: FormatoTexto: Es un objeto textFormat para cambiar el formato del texto(color,fuente,etc);
2. ColorFondo
3. ColorBorde
4. GrosorBorde
5. Velocidad: numérico, determina la velocidad de desplazamiento del texto;
6. RepetirIndefinidamente: por defecto true, indica si el texto se desplaza una sola vez o vuelve a empezar cada vez que ha pasado.
Se puede configurar la posicion y el tamaño del control con
- TextoDeslizante.SetSize (ancho,alto);
- TextoDeslizante.SetPosition (x,y);
Tambien se puede obtener las coordenadas y las dimensiones con las propiedades Ancho, Alto, X, Y;
Por último se pueden obtener referencias directas al MovieClip padre con la propiedad TextoDeslizante.Padre y al TextField del texto con TextoDeslizante.AreaTexto;
Nota: Aunque lo he nombrado como TextoDeslizante.loquesea son propiedades de instancia, no de clase, para llamarlas hay que crear antes un objeto.
Para los más nuevos en esto, los pasos para probar el control serían:
1. Crear un nuevo archivo ActionScript de nombre TextoDeslizante.as y pegar el código dentro
2. En el mismo directorio crear un documento flash (llamarse como se quiera)
3. En el primer frame del nuevo documento escribir el siguiente código:
Código :
// Constructor (padre:MovieClip,ancho:Number,alto:Number, x:Number,y:Number)
td = new TextoDeslizante(this,200,200,0,0);
for (var i=0;i<30;i++)
td.addTexto("Saludo " + i + "\n");
// para cambiar el color de la letra por ejemplo
formato = td.FormatoTexto;
formato.color = 0x00EE00;
formato.font = "Comic Sans MS";
td.FormatoTexto = formato;
// para cambiar el color de fondo
td.ColorFondo = 0;
// cambiar el color del borde
td.ColorBorde = 0xFF0000;
td.iniciarMovimiento();
Bueno espero que les sirva. Yo por ejemplo tengo pensado introducirlo en una web y que muestre constantemente ciertos datos que le iré pasando.
Saludos