Abril 13, 2004

Las rarezas de los botones

Hacía aproximadamente un par de años que no tenía que vérmelas con un botón, pero ayer en el curro recibimos una avalancha de elementos gráficos de un freelance, entre otros una tacada de botones.

Esos botones deben presentar un texto dinámico, y contienen dos campos de texto distintos. Uno para el estado normal, y otro para el rollover. Así que allá que me lancé

class net.designnation.UI.buttonHandler
{
 public static function setHandlers( instanceName: MovieClip, text: String )
 {
  instanceName[ "theText" ] = text;
  instanceName.onRollOver = function( )
  {
   this.tf.text = this[ "theText" ];
  }
  instanceName.onRollOut = function( )
  {
   this.tf.text = this[ "theText" ];
  }
 }
}

No funcionó. Así que intenté tracear el contenido del botón:

class net.designnation.UI.buttonHandler
{
 public static function setHandlers( instanceName: MovieClip, text: String )
 {
  instanceName[ "theText" ] = text;
  instanceName.onRollOver = function( )
  {
   for ( var k in this )
   {
    trace( k );
   }
   this.tf.text = this[ "theText" ];
  }
  instanceName.onRollOut = function( )
  {
   this.tf.text = this[ "theText" ];
  }
 }
}

Y aquí llegó la sorpresa. En el primer rollover la traza fue:

tabIndex
getDepth
enabled
useHandCursor
instance2

Pero en el rollout, instance2 cambió a instance3. Y en el siguiente rollover a instance4, y en el rollout instance5, y así sucesivamente.La primera vez que veía algo parecido, aunque supongo que para muchos de vosotros no será ninguna novedad. ¿La solución?: pues nada elegante, ya que se basa precisamente en ese comportamiento tan extraño:

class net.designnation.UI.buttonHandler
{
 public static function setHandlers( instanceName: MovieClip, text: String )
 {
  instanceName[ "theText" ] = text;
  instanceName.onRollOver = function( )
  {
   for ( var k in this )
   {
    if  ( k.substring( 0,8 )== "instance" && k.text != undefined )
    {
     this[ k ].text = this[ "theText" ];
    }
   }
  }
  instanceName.onRollOut = function( )
  {
   for ( var k in this )
   {
    if  ( k.substring( 0,8 )== "instance" && k.text != undefined )
    {
     this[ k ].text = this[ "theText" ];
    }
   }
  }
 }
}

¿Durante cuánto tiempo funcionará? Pues no lo sé, la verdad.

Una razón más para no volver a utilizar botones, y hacerlo todo con movieclips

Escrito por Cesar Tardaguila en: Abril 13, 2004 07:58 AM | TrackBack
Comentarios

La verdad es que los botones yo sólo los uso para cosas super simples, si veo que luego tendrán alguna cosa añadida uso directamente un movieClip.
Quizá hay que currarse los rollovers y rollouts a mano y en codigo, pero al final siempre es mejor de cara a futuras actualizaciones, ya que no tienen comportamientos extraños como les pasa a los botones.

Posted by: dasso en: Abril 13, 2004 10:44 AM

Desde luego, yo hacía muchísimo tiempo que no tenía que vérmelas con un botón, y espero que pase mucho más antes de la próxima vez...

Posted by: Cesar Tardaguila en: Abril 13, 2004 10:47 AM

Yo recuerdo que una vez alguien en una de las listas de distribución preguntaba que porqué flash seguía dándote la posibilidad de crear un objeto de tipo botón o de tipo gráfico cuando luego sólo usas mc's. Bueno, ahora que trabajo con animadores, me han explicado que para ellos es mejor usar gráficos que mc's para las animaciones porque bla bla ....( explicación larga ). Pero lo de los botones todavía nadie me ha dado una explicación de porqué se usan. Yo personalmente, hago como que no existen.

Posted by: Javier Tardáguila en: Abril 13, 2004 02:25 PM