Doble Click en Flash

Flash no tiene soporte nativo para detectar el Doble Click es por ello que mediante el uso del uso de setInterval veremos la forma de implementar el Doble Click. Primero veremos la forma básica y luego crearemos una clase para aplicarla a cualquier elemento que deseemos.

Doble Click Básico

La idea básica es crear un setInterval el cual ejecutará una función llamada onClick luego de 300 milisegundos. Cada vez que se haga click contamos la cantidad de clicks, y luego en la función onClick detectamos la cantidad de clicks hechos y dependiendo de ello ejecutamos una acción. Entonces si tenemos un movieclip llamado ‘boton‘ y deseamos agregarlo la opción Doble Click, tendríamos el siguiente código:

  1. var nclic:Number = 0;
  2. var intrv:Number = 0;
  3. boton.onPress = function() {
  4.     if (nclic == 0) {
  5.         intrv = setInterval(onClick, 300);
  6.     }
  7.     nclic++;
  8. }
  9. function onClick() {
  10.     if (nclic == 1) {
  11.         trace("Click Normal");
  12.     } else {
  13.         trace("Doble Click");
  14.     }
  15.     clearInterval(intrv);
  16.     nclic = 0;
  17. }

Clase DoubleClick

Entonces tomando en cuenta esta lógica creamos una clase, que controle esta opción. Para ello creamos un archivo llamado DoubleClick.as el cual recibirá tres parámetros al inicializarlo: el movieclip a controlar, la función para click normal y la función para el doble click.

  1. // File: DoubleClick.as
  2. class DoubleClick {
  3.     public var movie:MovieClip;
  4.     public function DoubleClick(vmovie, click1, click2) {
  5.         movie = vmovie;
  6.         movie.onClick1 = click1;
  7.         movie.onClick2 = click2;
  8.         movie.cAct = onClick;
  9.         movie.cInt = 0;
  10.         movie.cTot = 0;
  11.         movie.onPress = function() {
  12.             if (this.cTot == 0) {
  13.                 this.cInt = setInterval(this.cAct, 300, this);
  14.             }
  15.             this.cTot++;
  16.         }
  17.     }
  18.     public function onClick(target:MovieClip) {
  19.         if (target.cTot == 1) {
  20.             target.onClick1();
  21.         } else {
  22.             target.onClick2();
  23.         }
  24.         clearInterval(target.cInt);
  25.         target.cTot = 0;
  26.     }
  27. }

Luego, si tenemos un archivo fla donde tenemos un movieclip llamado boton, aplicamos la clase para detectar el doble click.

  1. // file: doubleclick.as
  2. import DoubleClick;
  3. function fclick1() {
  4.     txt.htmlText = "Click Normal<br>"+txt.htmlText;
  5. }
  6. function fclick2() {
  7.     txt.htmlText = "Doble Click<br>"+txt.htmlText;
  8. }
  9. new DoubleClick(boton, fclick1, fclick2);

Nótese que hemos creado primero las funciones a ejecutar y luego creamos una instancia de la clase DoubleClick con los parámetros respectivos, con lo cual obtenemos el siguiente resultado:

Cargando Flash

Con esta clase se pueden asignar detectores de eventos para el click normal y el doble click de forma rápida y en solo una línea de código. Finalmente les dejo los archivos fuentes de la clase y el ejemplo de como utilizarla.

Comentarios Total 3 comentarios


jaime
Publicado: 25/10/2007 5:27 pm

buenas. me parece muy interesante este articulo y muy util. ahora tengo el siguiente problema….como aplico esto mismo sobre una caja de texto creada dinamicamente?? creo que la razon es porque una caja de texto no tiene evento onPress… quzis podria hacerlo con un listener y tal, pero todavia no controlo suficiente de flash como para saber hacerlo minimamente bien… si alguien sabe como podria empezar, le quedaria muy agradecido. espero que cuano se responda aqui me llegue un mail icienomelo, porque si no no me enterare de la respuesta…por si acaso mandadme una copia al correo o un aviso (maije2@hotmail.com)

jaime
Publicado: 31/10/2007 4:45 pm

si a alguien le interesa, lo solucione al final con esta funcion:

onMouseUp = function () {
if (Selection.getBeginIndex() != -1 && Selection.getEndIndex() != -1) {
iniSel = Selection.getBeginIndex();
finSel = Selection.getEndIndex();
}
};

cuando el usuario clickea sobre la caja de texto, y suelta el raton, almacena el principio y el final de la seleccion en un par de variables. si clickea fuera (-1) no entra en el bucle. no seria necesaria la doble condicion del if, con uno de los dos valdria, pero como tampoco estaba de mas, pos la pongo para no liar a nadie.
a este metodo se le podria añadir lo del setInterval de la funcion que se detalla arriba y asi detectariamos igualmente el doble click sobre caja de texto, pero en caja de texto, realmente no hace falta, porque el dobleclick solo sirve generalmente para seleccionar una palabra y al hacer el 2º muoseUp ya nos localizaria el principio y el final de la seleccion de esa palabra, pero si alguien quiere añadirle un efecto extra al doble click sobre caja de texto, solo tendria que combiar las funciones de este post con la de mi respuesta y estaria listo :D
ojala esto le pueda servir a alguien que se pegue palizas buscando cosas por la red. un saludo a todos

Marcelo
Publicado: 06/05/2008 1:26 pm

Te felicito, la verdad que sos un maestro , todo lo que haces tienen muchísima calidad.. GRACIAS

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)