Cristalab

                 ¿Quieres registrarte?

Eventos click y doble click en un botón con Actionscript 3

Por: Zguillez
30 de Mayo del 2007
6416 de clabLevel
Otros artículos de Zguillez
17,576 visitas

Siguiendo el tema abierto por tomydb, en el que explicaba cómo detectar un doble click sobre un botón en flash con actionscript 2, explicaré cómo hacerlo con actionscript 3 ya que ahora es más sencillo gracias a que la clase MouseEvent nos permite detectar directamente el evento dobleclick.

El uso de la clase MouseEvent es muy simple y ya ha sido explicada en otros tips. Únicamente hemos de crear un listener que detecte el evento y ejecutar una acción.

Código :

clip.doubleClickEnabled = true
clip.addEventListener(MouseEvent.DOUBLE_CLICK, onDobleClick);
function onDobleClick(event:MouseEvent)
{
   trace("doble click");
}


Hemos de fijarnos en la propiedad doubleClickEnabled que es la que nos indica si la acción de doble click está activa o no. Por defecto la propiedad está con valor false, con lo que debemos pasarla a true en caso contrario el dobleclick no se ejecutaría.

Ahora, para hacer el tip más interesante (y para que a Bleend el tip no le parezca demasiado corto...) explicaré cómo detectar si hemos hecho un click o un dobleclick sobre el mismo botón. Es decir, que si clicamos sobre el botón una vez ejecute una acción y si clicamos doble ejecute otra distinta.

Siguiendo lo explicado en este otro tip empezaremos el código creando la clase para nuestro botón. Crearemos la clase Boton.as

A este botón le añadiremos los eventos de click y double_click.

Código :

package 
{
   import flash.display.MovieClip;
   import flash.events.MouseEvent;
   //-----------------------------------------
   public class Boton extends MovieClip
   {
      //-----------------------------------------
      public function Boton()
      {
         doubleClickEnabled = true;
         addEventListener(MouseEvent.CLICK, onClick);
         addEventListener(MouseEvent.DOUBLE_CLICK, onDobleClick);
      }
      //-----------------------------------------
      private function onClick(event:MouseEvent):void
      {
         trace("click");
      }
      private function onDobleClick(event:MouseEvent):void
      {
         trace("doble click");
      }
      //-----------------------------------------
   }
}


Si publicasemos ahora este botón veríamos el siguiente problema... al ejecutar el dobleclick tambien se ejecutaría el click normal, ya que los dos listeners son detectados. En el panel salida nos marcaría esto:

panel salida :


click
doble click


Esto no es lo que nos interesa, solo queremos que se ejecute una de las dos. Para solucionar el problema ampliaremos la clase siguiendo este proceso:

Crearemos una variable boleana donde indicaremos si hemos realizado un click o un dobleclick

Código :

private var isDobleClick:Boolean;


El valor de la variable lo cambiaremos a través de las funciones de los eventos:

Código :

private function onClick(event:MouseEvent):void
{
   isDobleClick = false;
}
private function onDobleClick(event:MouseEvent):void
{
   isDobleClick = true;
}


Escribiremos una tercera función que ejecute las acciones según el valor de la variable.

Código :

private function controlaClick(event:TimerEvent):void
{
   if (isDobleClick == false) {
      trace("click");
   } else {
      trace("doble click");
   }
}



Esta función controlaClick() la ejecutaremos desde la función onClick(), pero hemos de darle un margen de tiempo para detectar si hemos realizado un dobleclick, así que la ejecutaremos desde un intervalo. La función quedaría así:

Código :

private function onClick(event:MouseEvent):void
{
   isDobleClick = false;
   espera = new Timer(200, 1);
   espera.addEventListener(TimerEvent.TIMER, controlaClick);
   espera.start();
}


Cómo añadido podemos hacer que si damos un solo click sobre el botón pulsando la tecla "Ctrl" se ejecuten las acciones de un dobleclick, para eso utilizaremos la propiedad ctrlKey del evento MouseEvent. Esta propiedad devuelve true o false según esté pulsada la tecla en el momento del click. (Esta propiedad también está para "shift" y "Alt")

Código :

if (event.ctrlKey) {
   isDobleClick = true;
}


La clase completa sería esta:

Código :

package 
{
   import flash.display.MovieClip;
   import flash.events.MouseEvent;
   import flash.utils.Timer;
   import flash.events.TimerEvent;
   //-----------------------------------------
   public class Boton extends MovieClip
   {
      private var isDobleClick:Boolean;
      private var espera:Timer;
      //-----------------------------------------
      public function Boton()
      {
         doubleClickEnabled = true;
         addEventListener(MouseEvent.CLICK, onClick);
         addEventListener(MouseEvent.DOUBLE_CLICK, onDobleClick);
      }
      //-----------------------------------------
      private function onClick(event:MouseEvent):void
      {
         isDobleClick = false;
         espera = new Timer(200, 1);
         espera.addEventListener(TimerEvent.TIMER, controlaClick);
         espera.start();
         if (event.ctrlKey) {
            isDobleClick = true;
         }
      }
      private function onDobleClick(event:MouseEvent):void
      {
         isDobleClick = true;
      }
      private function controlaClick(event:TimerEvent):void
      {
         if (isDobleClick == false) {
            trace("click");
         } else {
            trace("doble click");
         }
      }
      //-----------------------------------------
   }
}


^^

PD. zguillez no se hace responsable del suicidio de ningún diseñador.


Artículos Relacionados


Etiquetas actionscript_3

Comentarios | Enviar un comentario
como siempre Zguillez, excelente tip :)
Por: eldervaz
Fenomenal!! pero no se por que en la version anterior no venia este evento MouseEvent.DOUBLE_CLICK.

Creo que hay muchas cosas interesantes por conocer en AS3 , y mi duda será ¿Cuando llegara la version en español de Flash CS3?
Por: rowland_blog
JAJA, Pues sí, Zguillez, al final si te quedó perfecto. :P

Si, los diseñadores te matarán. XD XD
Aunque esta fantástico es .as U_U
Por: Bleend
Estoy aprendiendo a usar elnuevo flash cs3, y tengo una pregunta, cree un boton llamado contáctenos, y quiero que al dar clik se vaya a un frame determinado.. pero cuando quiero darle la acción al boton, no se ativa la ventana de acciones, no puedo escribirle ningun código... que puedo hacer...
Por: Jose Luis_blog

Jose Luis_blog :

Estoy aprendiendo a usar elnuevo flash cs3, y tengo una pregunta, cree un boton llamado contáctenos, y quiero que al dar clik se vaya a un frame determinado.. pero cuando quiero darle la acción al boton, no se ativa la ventana de acciones, no puedo escribirle ningun código... que puedo hacer...
Escribe el código en los frames. U_U
Por: Bleend
me marca error "los paquetes no pueden anidarse"

que onda.
es adobe flash y AS 3
Por: Uk-blog
Hola, estoy tratando de cachear el double click pero no pasa nada. Uso este código:

doubleClickEnabled = true;

addEventListener( MouseEvent.DOUBLE_CLICK, function():void{trace('doble clic')} );

Esto lo hago directamente en el Stage, o sea en la clase principal de la aplicación, que extiende a MovieClip.

Si quiero detectar otros eventos del mouse, funcionan perfecto, pero el doble click no.

PD: Uk-blog: el código de este ejemplo es para ponerlo en un archivo externo .as, no en las acciones de un frame, que ya están de por sí dentro de un paquete, por eso no puedes meterle un paquete adentro.
Saludos!
Por: www.petruza.com.ar-blog
¿Me podrían decir si hay alguna forma de usar una misma clase para agregar la misma accion a distintoes elementos de un MovieClip? agradeceria que me pudieran dar la liga a algun ejemplo.
Por: db140
kiero calidad en el dia de la boda de mi madre y sergio ese dia quiero que sean felices para toda la vida
Por: almudena lopez cuesta-blo
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.