Domanda

Mi piacerebbe sistemare le cose in modo da avere una catena di gestori di eventi da tastiera nella mia applicazione flex, i quali vengono interrogati quando si verificano eventi key down. Fondamentalmente, quando un componente visivo è sullo schermo, è un candidato per la gestione di un evento di pressione dei tasti. Qualcosa del genere (chiaramente questo è pseudocodice):

<application handles_keys="F5, F6">
    <tabGroup>
        <tab1 handles_keys="pgup, pgdn">
            <control handles_keys="0,1,2,3,4,5,6,7,8,9" />
        </tab1>
        <tab2 handles_keys="pgup, left, right"/>
    </tabGroup>
</application>

Ho scritto una classe che risponderà agli eventi chiave nel modo desiderato, quindi come posso registrare una o più istanze di questa classe per ottenere i risultati desiderati? Inoltre, tieni presente che ci sono alcune situazioni in cui questa classe dovrebbe ricevere eventi che normalmente verrebbero gestiti da un componente dell'interfaccia utente. Il tasto TAB è l'esempio principale; Ho alcuni casi in cui voglio che il mio gestore di eventi key down venga attivato anche quando lo stato attivo è su un campo di testo.

È stato utile?

Soluzione 2

L'approccio corretto si è rivelato essere un gestore di eventi di tastiera globale, aggiunto come listener in giù allo stage quando viene chiamato l'evento createComplete dell'applicazione. Questo invia quindi eventi di dominio per ogni pressione di tasti o combinazione di questi. Purtroppo, il modello di filtro per componente non ha funzionato.

Eseguirò il porting di questa app nel framework Cairngorm, che dovrebbe funzionare davvero bene una volta terminato.

Altri suggerimenti

Il modo in cui hai configurato il tuo pseudocodice in questo momento, dovresti sottoclassare tutti i diversi contenitori e aggiungere una proprietà handle_key a ciascuno. Potresti voler esternalizzare la funzionalità in una classe separata come questa:

<KeyHandler target="{tab1}" handlesKeys="pgup,left,right"/>

Per quanto riguarda la cattura effettiva degli eventi, dovrai aggiungere un listener KeyboardEvent.KEY_DOWN sul UIComponent che desideri ascoltare. Dovrai anche impostare l'argomento useCapture di addEventListener () su true . Ciò ti consentirà di catturare l'evento e impedirlo invece che l'evento colpisca l'oggetto e faccia gorgogliare.

target.addEventListener(KeyboardEvent.KEY_DOWN, target_onKeyDown, true);

All'interno dell'evento target_onKeyDown , controlla se hai una corrispondenza per una delle tue chiavi che vuoi gestire e se c'è una corrispondenza, chiama event.stopImmediatePropagation () o event.preventDefault () a seconda di cosa devi fare.

Il riferimento linguistico Flex 3 fornisce una buona spiegazione della propagazione degli eventi e degli eventi della tastiera:

http://livedocs.adobe.com/flex /3/langref/flash/events/Event.html

  1. quando l'oggetto visualizzato viene aggiunto allo schermo, quindi inizia ad ascoltare gli eventi della tastiera del palco

  2. quando l'oggetto è stato rimosso dallo schermo, rimuovere il listener di eventi da tastiera

  3. sugli eventi della tastiera filtra gli eventi necessari :)

Il codice per una classe Canvas di cui hai bisogno dovrebbe apparire così:

class MyCanvas extends Canvas
{

   public function MyCanvas(){
       super();
   }

   override protected function createChildren():void{
       super.createChildren();
       this.systemManager.stage.addEventListener(KeyboardEvent.KeyUp, onKeyUpHandler);
   }

   private function onKeyUpHandler(e:KeyboardEvent):void{
       // handle your code

       switch(e.charCode){
           case Keyboard.1:
           case Keyboard.2:
           case Keyboard.3:
           case Keyboard.4:
           case Keyboard.5:
           case Keyboard.6:
           case Keyboard.7:
           case Keyboard.8:
           case Keyboard.9:{
                   // do my stuff
                   break;
                 }
            case Keyboard.F1:{
                   // do other stuff
                   break;
                 }

           }

       }

   }   

   public function destroy():void{
       //don't forget to remove listeners for stupid flash garbage collector
       this.systemManager.stage.removeEventListener(KeyboardEvent.KeyUp, onKeyUpHandler);
   }

}

Ignora eventuali errori di ortografia: D Ho scritto il codice dalla mia mente :))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top