2011-09-24 22 views
5

Una domanda precedente mi ha fatto pensare. È possibile simulare un MouseEvent.CLICK per essere licenziato semplicemente sparando prima un MOUSE_DOWN seguito da un MOUSE_UP.È possibile SIMULARE un clic del mouse usando un mouse su e giù per gli eventi?

Come per la doumentation di Adobe. "... Perché si verifichi un evento click, deve sempre seguire questa serie di eventi nell'ordine in cui si verifica: evento mouseDown, quindi mouseUp. L'oggetto target deve essere identico per entrambi gli eventi, altrimenti l'evento click non Si può verificare qualsiasi numero di altri eventi del mouse in qualsiasi momento tra gli eventi mouseDown o mouseUp, ma l'evento click si verifica ancora. " http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/InteractiveObject.html#event:click

Dai miei test mostra che l'evento CLICK NON è costruito dalla coda di eventi di ActionScript 3. O c'è qualcosa che non va nel codice?

See:

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"); 
    } 
} 
} 

dovrei ottenere due 'onclick()' eventi invece di uno.

+3

Hai ragione. Non sta creando un nuovo evento CLICK quando vede un MOUSE_DOWN seguito da un MOUSE_UP (probabilmente perché sarebbe molto strano farlo nel codice del ciclo degli eventi e molto più naturale generare l'evento nel codice di elaborazione dell'ingresso del mouse). Dovrai sparare tutti e tre manualmente. Penso che la documentazione si riferisse a eventi regolari del mouse; Sparando manualmente, è improbabile che ci sia un codice speciale che impone l'ordine dell'evento. – Cameron

+1

Penso che la documentazione confonda causa ed effetto un po '. Un evento click viene generato dal mouse giù + mouse sullo stesso oggetto. Di conseguenza, tutti e tre gli eventi ActionScript vengono inviati. Il runtime non utilizza gli stessi eventi ActionScript per determinare se inviare un evento click. –

risposta

3

Il motivo per cui non è possibile è che tutti e tre i tipi sono creati dal plugin e non dipendono l'uno dall'altro.

MouseEvent.MOUSE_DOWN viene generato non appena si preme su un oggetto interattivo. MouseEvent.MOUSE_UP viene generato non appena si rilascia il mouse, non dipende dal clic del mouse che ha avviato MOUSE_DOWN nello stesso oggetto InteractiveObject. MouseEvent.CLICK verrà attivato solo quando entrambi gli eventi si svolgono nello stesso oggetto senza che il cursore lasci l'oggetto tra il cursore del mouse e il mouse in alto.

Quindi è possibile vedere che c'è un caso semplice, o addirittura due, in cui vengono attivati ​​sia MOUSE_DOWN sia MOUSE_UP, ma CLICK non viene chiamato perché l'evento non è un CLIC.

Inoltre, la possibilità di inviare semplicemente un evento MouseEvent.CLICK rende inutile creare un'interazione utente falsa attivando più eventi del mouse, quando ne viene richiesta solo una. Sarebbe scomodo dover tenere traccia di ogni oggetto cliccato nel listener del mouse verso il basso, al fine di verificare che anche il mou up debba attivare un clic. Dovresti anche rimuovere i riferimenti quando si verifica un evento ROLL_OUT.

In breve, l'evento CLICK è molto più degli eventi MOUSE_DOWN e MOUSE_UP. Gestisce anche che gli eventi si sono verificati in successione e sullo stesso oggetto di visualizzazione senza lasciare l'oggetto. Quando ciò accade, e SOLO quando ciò accade, Flash invia un evento CLICK.

2

è impossibile, questo codice:

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'); 
     }  
    } 
} 

uscite solo:

premuti
cliccato

dopo che un tasto viene premuto sulla tastiera

+0

Oooo, mi piace ... se (stage) ... – eLouai

+0

Sono curioso di sapere perché ... penseresti che lo faranno, lascia aperta tutta la gestione degli eventi agli errori che trovo. Poiché utilizzano l'ambiente di sistema in cui si trovano per costruire l'evento CLICK anziché utilizzare i propri eventi. – eLouai

+0

Non mi piace la possibilità di inviare un 'Evento' al di fuori di' EventDispatcher'. Evitalo se puoi. L'ho visto usato quando gli sviluppatori vogliono "falsificare" un clic per abilitare il primo pulsante in un menu, ma preferisco piuttosto scrivere una funzione che spedisce dall'interno. – Mattias

0

non è sicuro su questo per il flash. Ma quando stavo imparando Windows MFC ed ero senza tracce. Quello che ho fatto è che ho inviato WM_MOUSEDOWN seguito da WM_MOUSEUP dopo un breve ritardo. Ha funzionato e anche gli stati visivi del pulsante sono cambiati - senza alcun clic del mouse!

0

Se ho capito cosa stai chiedendo, la risposta è SI.

Sono curioso di sapere se ho semplificato la soluzione qui, soprattutto dopo aver letto il tentativo del codice. È molto semplice "simulare" un clic del mouse. Il codice riportato di seguito emette due istruzioni "Sono stato cliccato" quando si fa clic sull'oggetto e nessuno quando si sposta il mouse verso il basso per poi uscire dai limiti degli oggetti.

Questa classe ha esteso un MovieClip creato sul palco in modo da non dover codificare una casella.

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); 
    } 
} 
} 

Nel codice Credo che il problema è che si sta tentando di eseguire listener di eventi invia attraverso un "onEnterFrame", che sarà sempre e solo sparare un evento per fotogramma - non due. Anche dopo aver testato il tuo codice non sono sicuro di cosa stavi cercando di ottenere con la variabile "tick" perché non lo hai mai resettato. Quindi l'evento MOUSE_UP si attiva una volta (quando il segno di spunta = 2, a meno che non si tenga premuto il mouse), quindi nessuno degli altri dispacci si spara di nuovo.

0

Non so bene perché tutti stiano facendo questi picchi complessi. O forse sto solo supervisionando qualcosa.

Comunque, ecco un modo molto semplice per controllare:

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)); 

E la risposta sarebbe, "no, non è possibile" ...

... e probabilmente dovrebbe essere seguito da una contro-domanda: perché dovrei voler simulare un evento click usando una sequenza di mouse e mouse, quando posso inviare un evento click altrettanto bene?

Sono un pulsante, con una crisi esistenziale?

Oppure è una domanda per pura curiosità? Ma sai cosa è successo al gatto ... Giusto, ma forse è il gatto di Schrödinger, il che significa che alla fine di questo ragionamento del tutto irrilevante, REALMENTE ha davvero fatto la curiosità e NON ha ucciso il gatto.

Tranne se il gatto è fuori da una scatola.

Quindi probabilmente è stato sprecato.

Vedere, pensare fuori dalla scatola può farti uccidere.

Problemi correlati