2011-09-24 24 views
5

Una pregunta anterior me ha hecho pensar. ¿Es posible simular un MouseEvent.CLICK para que se active disparando primero un MOUSE_DOWN seguido de un MOUSE_UP?¿Es posible SIMULAR un clic del mouse con un mouse hacia abajo y hacia arriba?

Según la documentación de Adobe. "... Para que se produzca un evento de clic, siempre debe seguir esta serie de eventos en el orden de aparición: evento mouseDown, luego mouseUp. El objeto de destino debe ser idéntico para ambos eventos; de lo contrario, el evento click no ocurrir. Cualquier cantidad de otros eventos de mouse puede ocurrir en cualquier momento entre los eventos MouseDown o mouseUp, el evento click aún ocurre ". http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#event:click

De mis pruebas muestra que el evento CLIC NO se construye a partir de la cola de eventos de ActionScript 3. O hay algo mal con el código?

Ver:

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 
import flash.events.MouseEvent; 

[SWF(backgroundColor="0xFFFFFF", frameRate="30", width="800", height="600")] 

public class Test extends Sprite 
{ 
    private var spr:Sprite = new Sprite(); 
    public function Test() 
    { 
     trace("Test()"); 
     this.addEventListener(Event.ADDED_TO_STAGE,init); 
    } 
    public function init(e:Event):void 
    { 
     trace("init()"); 
     spr.graphics.beginFill(0xFF0000); 
     spr.graphics.drawRect(0,0,200,80); 
     spr.graphics.endFill(); 
     addChild(spr); 
     addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     spr.addEventListener(MouseEvent.CLICK, onClick); 
    } 
    private var tick:int = 0; 
    private function onEnterFrame(e:Event):void 
    { 
     if (tick == 1) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN,true,false)); 
     if (tick == 2) spr.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP,true,false)); 
     if (tick == 3) spr.dispatchEvent(new MouseEvent(MouseEvent.CLICK,true,false)); 
     tick++; 
    } 
    private function onClick(e:MouseEvent):void 
    { 
     trace("onClick() MouseEvent.CLICK dispatched"); 
    } 
} 
} 

que deben recibir dos 'onClick()' eventos en lugar de uno.

+3

Tienes razón. No está creando un nuevo evento CLICK cuando ve un MOUSE_DOWN seguido de un MOUSE_UP (probablemente porque sería muy extraño hacerlo en el código del evento y mucho más natural para generar el evento en el código de procesamiento de entrada del mouse). Tendrá que disparar los tres manualmente. Creo que la documentación se refería a eventos regulares de mouse; Disparándolos manualmente, es poco probable que haya algún código especial que haga cumplir el orden del evento. – Cameron

+1

Creo que la documentación confunde causa y efecto un poco. Se genera un evento de clic desde el mouse hacia abajo + mouse hacia arriba en el mismo objeto. Los tres eventos de ActionScript se envían como resultado. El tiempo de ejecución no usa los eventos de ActionScript para determinar si se debe enviar un evento de clic. –

Respuesta

3

La razón por la que no puede hacerlo es porque los tres tipos son creados por el complemento y no dependen el uno del otro.

MouseEvent.MOUSE_DOWN se activa tan pronto como presiona sobre un objeto interactivo. MouseEvent.MOUSE_UP se activa tan pronto como suelta el mouse, no depende de que el clic del mouse haya iniciado un MOUSE_DOWN dentro del mismo InteractiveObject. MouseEvent.CLICK solo se activará cuando ambos eventos tengan lugar en el mismo objeto sin que el cursor salga del objeto entre el itnerval del mouse y el mouse hacia arriba.

Puede ver que hay un caso simple, o dos pares, en los que MOUSE_DOWN y MOUSE_UP se activan, pero no se llama CLICK porque el evento no es un CLIC.

Además, la capacidad de simplemente enviar un evento MouseEvent.CLICK hace que sea innecesario crear una interacción falsa del usuario activando varios eventos del mouse, cuando solo se necesita uno. Sería incómodo tener que rastrear cada objeto en el que se hizo clic en el oyente del mouse hacia abajo, para verificar que la animación también active un clic. También necesitaría eliminar referencias cuando sucediera un evento ROLL_OUT.

En resumen, el evento CLICK es realmente mucho más que los eventos MOUSE_DOWN y MOUSE_UP. También se está encargando de que los eventos ocurran en sucesión y en el mismo objeto de visualización sin abandonar el objeto. Cuando eso sucede, y SÓLO cuando eso sucede, el flash envía un evento CLIC.

2

que es imposible, este código:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.KeyboardEvent; 
    import flash.events.MouseEvent; 

    /** 
    * ... 
    * @author www0z0k 
    */ 
    public class Main extends Sprite { 

     public function Main():void { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      stage.addEventListener(MouseEvent.CLICK, onClick); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown); 
     } 

     private function onStageKeyDown(e:KeyboardEvent):void { 
      trace('pressed'); 
      stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN)); 
      stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP));   
      stage.dispatchEvent(new MouseEvent(MouseEvent.CLICK));   
     } 

     private function onClick(e:MouseEvent):void{ 
      trace('clicked'); 
     }  
    } 
} 

salidas simplemente:

presionados
hace clic

después de pulsar una tecla en el teclado

+0

Oooo, me gusta eso ... si (etapa) ... – eLouai

+0

Tengo curiosidad por qué ... uno pensaría que lo harían, deja todo el manejo del evento abierto a los errores que encuentro. Ya que están usando el entorno del sistema en el que se encuentran para construir el evento CLICK en lugar de usar sus propios eventos. – eLouai

+0

No me gusta la posibilidad de enviar un 'Evento' fuera del' EventDispatcher'. Evitalo si puedes. Lo he visto usar cuando los desarrolladores quieren "falsificar" un clic para habilitar el primer botón en un menú, pero prefiero escribir una función que se despache desde el interior. – Mattias

0

no está seguro acerca de esto para flash. Pero cuando estaba aprendiendo Windows MFC y no tenía ni idea. Lo que hice fue que envié WM_MOUSEDOWN seguido de WM_MOUSEUP después de un breve retraso. Funcionó y los estados visuales del botón también cambiaron, ¡sin hacer clic con el mouse!

0

Si entiendo lo que está preguntando, la respuesta es SÍ.

Tengo curiosidad por haber simplificado la solución aquí, especialmente después de leer el intento de código. Es muy simple "simular" un clic del mouse. El siguiente código muestra dos declaraciones "Me han hecho clic" cuando se hace clic en el objeto y ninguna cuando mueve el mouse hacia abajo y luego sale de los límites de los objetos.

Esta clase extendió un MovieClip que creé en el escenario, así que no tuve que codificar un cuadro.

package { 

import flash.display.MovieClip; 
import flash.events.MouseEvent; 


public class clickMe extends MovieClip { 


    public function clickMe() { 
     // constructor code 

     this.addEventListener(MouseEvent.CLICK, clicked); 
     this.addEventListener(MouseEvent.MOUSE_DOWN, mDown); 

    } 

    private function clicked(e:MouseEvent):void{ 
     trace("I have been clicked"); 
     this.removeEventListener(MouseEvent.MOUSE_UP, clicked); 
    } 

    private function mDown(e:MouseEvent):void{ 
     this.addEventListener(MouseEvent.MOUSE_UP, clicked); 
    } 
} 
} 

En su código Creo que el problema es que se trata de abrir detector de eventos envía a través de un "onEnterFrame" que sólo alguna vez disparar un evento por marco - no dos. Además, después de probar tu código, no estoy seguro de lo que intentabas lograr con la variable "marcar" porque nunca la reinició. Entonces, el evento MOUSE_UP se dispara una vez (cuando tick = 2, a menos que mantenga presionado el mouse), entonces ninguno de los otros despachos volverá a disparar.

0

No estoy seguro de por qué todos están haciendo estos complejos picos. O tal vez solo estoy supervisando algo.

De todos modos, aquí hay una manera muy fácil de comprobarlo:

import flash.events.MouseEvent; 

stage.addEventListener(MouseEvent.CLICK, function(){ 
    trace('clicked'); 
}); 

stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN)); 
stage.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP)); 

Y la respuesta sería, "no, no es posible" ...

... y probablemente deba ir seguido de una contra pregunta: ¿POR QUÉ quiero simular un evento de clic usando una secuencia de mousedown y mouseup, cuando puedo enviar un clic también?

¿Soy un botón, tengo una crisis existencial?

¿O es una pregunta por mera curiosidad? Pero ya sabes lo que le pasó al gato ... Correcto, pero tal vez sea el gato de Schrödinger, lo que significa que al final de esta línea de pensamiento completamente irrelevante, la curiosidad REALMENTE lo hizo y NO mató al gato.

Excepto si el gato está fuera de la caja.

Entonces probablemente se haya desperdiciado.

Mira, pensar de la caja puede hacerte matar.

Cuestiones relacionadas