2009-01-11 8 views
2

J'ai une interface qui doit réagir aux "longues pressions sur les touches". Cela signifie 2 actions différentes pour la même clé sur la base de la durée de la clé a été vers le bas:AS3: Détecter les touches longues

PRESSE CURSEUR GAUCHE: action A

PRESSE & TENIR CURSEUR GAUCHE: Action B

Eh bien, il est la preuve plus difficile que j'ai pensé. Le problème principal est que Keyboard.KEY-DOWN et Keyboard.KEY-UP se déclenchent continuellement si vous maintenez la touche enfoncée. Cela me semble bizarre bien que cela puisse avoir du sens si vous pensez à imputer du texte (si vous entrez du texte et maintenez une touche enfoncée, il commence à remplir l'espace).

Lorsque j'essayais de résoudre le problème, j'ai pensé à démarrer un compteur sur le KEY-DOWN et à le réinitialiser sur KEY-UP. Ensuite, s'il atteint un certain seuil, déclenchez un événement. Le problème est que le compteur se réinitialise tout de suite parce que l'événement KEY-UP se déclenche tout le temps. Je connais les classes d'interrogation au clavier telles que BigRoom et Senocular mais elles ne résolvent pas le problème car elles basent leur statut sur les mêmes événements.

Je pourrais aller pour les minuteurs démarrant une minuterie sur KEY-DOWN et après x millisecondes vérifier si la clé est toujours en bas, mais cela supposerait que la touche a été tout le temps. Je ne pense pas que ce serait fiable.

Et c'est le point que je commence à manquer d'idées. Y a-t-il une méthode beaucoup plus simple que j'ai oubliée? J'espère qu'il y en a!

Merci,

Juan

Répondre

1

Désolé, cela m'a pris tellement de temps pour revenir, mais j'étais au milieu du projet et je n'ai vraiment pas eu le temps de regarder plus en profondeur. Maintenant, j'ai et j'ai trouvé qu'il n'y a pas un tel problème. Lire ci-dessous pour la réponse longue.

Ceci est seulement hapenning dans des circonstances très spécifiques et probablement aucun à blâmer Adobe.

J'ai un iMac qui exécute Ubuntu et développe Flash sur une machine virtuelle exécutant Windows XP. Ce problème n'apparaît que sur le XP virtuel, la même application fonctionnant nativement sur Ubuntu (et probablement sur d'autres systèmes) ne montre pas le problème.

Et parce que j'ai d'autres bizarreries clavier lors de l'utilisation de la machine virtuelle, je pense que le problème est sur le pilote de clavier de VirtualBox.

Merci à tous ceux qui ont pris le temps de se pencher là-dessus. J'espère que cela aide les autres!

Juan

+0

Ah! C'est la machine virtuelle qui fait quelque chose d'étrange pour émuler l'auto-répétition. Très intéressant. (Par ce que je veux dire, très étrange.) –

0

Êtes-vous sûr de feux KEY_UP lorsque vous appuyez sur une touche enfoncée. Cela semble tellement bizarre! Ma période d'essai Flex a expiré et je n'ai pas mis en place un environnement où je peux compiler en utilisant uniquement le SDK, donc je ne peux pas expérimenter avec cela. Mais this actionscript.org forum thread about missing KEY_UP:s semble suggérer qu'il pourrait être un problème de paramètres avec le lecteur flash. Ce n'est pas le même problème que celui que vous rencontrez, mais ils se plaindraient certainement s'ils avaient votre problème ...

0

Cette publication http://www.futtock.co.uk/flash/smooth-movieclip-key-control-in-as3/ peut contenir un indice. BTW: votre système génère-t-il un nouveau key_down juste après le key_up non désiré? Dans ce cas, votre clavier pourrait être dans un réglage bizarre, ce qui le rend auto-répétition une touche qui est maintenue enfoncée. Juste une supposition ...

1

Je me demandais si vous aviez déjà trouvé une solution à celle-ci. Je n'avais pas eu la même expérience, alors je suis allé de l'avant et j'ai lancé un test rapide pour voir si j'avais le même résultat, et je n'ai pas - je reçois seulement les événements KEY_UP quand je lâche la clé:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="app_applicationComplete()"> 

    <mx:Script> 
     <![CDATA[ 

      private function app_applicationComplete():void 
      { 
       stage.addEventListener(KeyboardEvent.KEY_DOWN, app_keyDown); 
       stage.addEventListener(KeyboardEvent.KEY_UP, app_keyUp); 

       setFocus(); 
      }  

      private function app_keyDown(event:KeyboardEvent):void 
      { 
       trace("Down..."); 
      } 

      private function app_keyUp(event:KeyboardEvent):void 
      { 
       trace("UP!"); 
      } 

     ]]> 
    </mx:Script> 

</mx:Application> 

Mes résultats semblent plus comme ça - trois coups:

Down... 
UP! 
Down... 
UP! 
Down... 
UP! 

... et une "retenue et relâcher":

Down... 
Down... 
Down... 
Down... 
Down... 
Down... 
Down... 
Down... 
Down... 
Down... 
Down... 
Down... 
UP! 

Juste pensé que je partagerais ; Je suppose qu'il est également possible, bien que peu probable, que votre clavier envoie des messages «up» à l'OS alors que ce ne devrait pas être le cas.Mais en supposant que vous puissiez faire ce travail, vous pourriez probablement compter le nombre de notifications KEY_DOWN successives, en réinitialisant le compteur lorsque vous obtenez un KEY_UP, pour inférer que la touche est maintenue au lieu d'être tapée et relâchée. J'espère que cela aide!

+0

Salut, « votre clavier de l'envoi « jusqu'à » messages au système d'exploitation quand il ne devrait pas être » Cela me mis en route pour trouver le problème. Ta:) –

+0

Super, je me demandais comment cela s'est avéré. Faites-moi savoir comment ça se passe! –

Questions connexes