Comunidad de diseño web y desarrollo en internet online

Efecto de desplazamiento de un texto

Citar            
MensajeEscrito el 26 Abr 2007 11:57 pm
Hola buenas.

Tengo un pequeño recuadro en una página en el que quiero que se muestre un texto con un efecto como el de los créditos de las películas, es decir que las líneas del texto vayan subiendo constantemente y lentamente. El texto lo cargo desde un archivo xml.

He intentado hacerlo utilizando las propiedades de scroll de TextField, algo similar a:

Código :

var velocidad = 3;
var tmp = 0;

onEnterFrame = function() {
   tmp++;
   if (tmp == velocidad) {
      areaTexto.scroll++;
      tmp=0;
   }
}


Bueno más o menos. Esto hace que el texto se vaya desplazando hasta alcanzar el límite del scroll, pero no crea el efecto que busco porque el movimiento es demasiado brusco, es decir, me gustaría que el texto se desplazase de una forma más uniforme. Alguien podría ayudarme a crear ese efecto, cualquier idea sería de agradecer.

Saludos

Por adriesp

113 de clabLevel

1 tutorial

Genero:Masculino  

Salamanca

firefox
Citar            
MensajeEscrito el 27 Abr 2007 12:19 am
He tenido una idea que probaré mañana, quizá cargando todo el texto en un textField o en un textArea y recorrerlo con una máscara pueda funcionar

Por adriesp

113 de clabLevel

1 tutorial

Genero:Masculino  

Salamanca

firefox
Citar            
MensajeEscrito el 27 Abr 2007 11:30 am
Hola:

Yo tambien he estado buscando el mismo el mismo efecto pero no he podido, me cuentas como te fuè para probarlo

suerte mi amigo

Por leoalvis

2 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 27 Abr 2007 08:40 pm
Simplemente pongan el texto dentro de un MovieClip y muevan el movieclip


saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 28 Abr 2007 12:22 am
Efectivamente, se puede hacer con la máscara. Para el compañero que estaba atascado:

1. Crea un TextField dentro de un movieClip y pon todo el texto dentro de ese TextField. El TextField debe ser lo bastante grande para que quepa todo el texto.

2. Crea un movieClip que te sirva de máscara. Puede ser un movieClip con un rectángulo y lo situas en las mismas coordenadas en que tienes el TextField.

3. Activa el movieClip del rectángulo como máscara del texto con la función setMask(). Tiene que ser con esta función para que se vea el texto dinámico.

4. Incrementa o disminuye la coordenada "_y" del movieClip del texto progresivamente con onEnterFrame por ejemplo.

Bien estos serían los pasos básicos, te los dejo para que lo intentes. Si necesitas más ayuda o algo de código que te oriente pídemelo. De todas formas estoy tratando de crear una clase que permita hacer esto automáticamente, si consigo algo aceptable la postearé aquí. Saludos

Por adriesp

113 de clabLevel

1 tutorial

Genero:Masculino  

Salamanca

firefox
Citar            
MensajeEscrito el 28 Abr 2007 01:36 pm
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

Por adriesp

113 de clabLevel

1 tutorial

Genero:Masculino  

Salamanca

firefox

 

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