Обработка событий клавиатуры Flex 3 - PullRequest
2 голосов
/ 31 июля 2009

Я бы хотел упорядочить вещи так, чтобы у меня в гибком приложении была цепочка обработчиков событий клавиатуры, которые запрашиваются при возникновении события нажатия клавиши. По сути, когда визуальный компонент находится на экране, он является кандидатом для обработки события нажатия клавиши. Примерно так (ясно, что это псевдокод):

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

У меня есть класс, который будет реагировать на ключевые события так, как я хочу, так как мне зарегистрировать один или несколько экземпляров этого класса, чтобы получить желаемые результаты? Также обратите внимание, что в некоторых ситуациях этот класс должен получать события, которые обычно обрабатываются компонентом пользовательского интерфейса. Клавиша TAB является основным примером; У меня есть несколько случаев, когда я хочу, чтобы мой обработчик событий нажатия клавиши запускался, даже когда фокус находится на текстовом поле.

Ответы [ 3 ]

2 голосов
/ 01 августа 2009

Как вы сейчас настроили свой псевдокод, вам нужно было бы создать подкласс для всех различных контейнеров и добавить свойство handles_key к каждому из них. Возможно, вы захотите перенести функциональность в отдельный класс, например так:

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

Что касается фактического перехвата событий, вам нужно добавить KeyboardEvent.KEY_DOWN слушатель на UIComponent, который вы хотите прослушать. Вам также нужно установить аргумент useCapture для addEventListener() в true. Это позволит вам захватить событие и предотвратить его, вместо того, чтобы событие попадало в объект и пузырилось.

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

Внутри вашего события target_onKeyDown проверьте, есть ли у вас совпадение с одним из ваших ключей, с которым вы хотите работать, и если есть совпадение, позвоните по номеру event.stopImmediatePropagation() или event.preventDefault() в зависимости от того, что вам нужно сделать.

Справочник по языку Flex 3 дает хорошее объяснение распространения событий и событий клавиатуры:

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

1 голос
/ 10 сентября 2009

Правильный подход, оказывается, был глобальным менеджером событий клавиатуры, добавленным в качестве слушателя нажатия клавиш на этап, когда вызывается событие creationComplete приложения. Затем он отправляет события домена для каждого нажатия клавиши или их комбинации. К сожалению, модель фильтрации по компонентам не сработала.

Я собираюсь перенести это приложение в фреймворк Cairngorm, который должен работать очень хорошо, как только я это сделаю.

1 голос
/ 01 августа 2009
  1. , когда отображаемый объект добавляется на экран, затем запускайте прослушивание событий сценической клавиатуры

  2. когда объект был удален с экрана, удалить прослушиватель событий клавиатуры

  3. на клавиатурных событиях фильтрует нужные вам события:)

Код необходимого вам класса Canvas должен выглядеть следующим образом:

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

}

Игнорировать любые промахи: D Я написал код из моей головы:))

...