Flex 3键盘事件处理

时间:2009-07-31 15:14:52

标签: flex flex3 event-handling keyboard keyboard-shortcuts

我想安排一些事情,以便在我的flex应用程序中有一系列键盘事件处理程序,当关键事件发生时,所有人都会被查询。基本上,当可视组件在屏幕上时,它是处理按键事件的候选者。像这样的东西(显然这是伪代码):

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

我写了一个类,它将以我想要的方式响应关键事件,那么如何注册这个类的一个或多个实例以获得我想要的结果?另请注意,在某些情况下,此类应接收通常由UI组件处理的事件。 TAB键是主要的例子;我有一些情况,即使焦点在文本字段上,我也希望我的按键事件处理程序能够触发。

3 个答案:

答案 0 :(得分:2)

现在您的伪代码设置方式,您必须子类化所有不同的容器并为每个容器添加handles_key属性。您可能希望将功能外部化为单独的类,如下所示:

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

至于实际捕捉事件,你需要在你想听的KeyboardEvent.KEY_DOWN上添加一个UIComponent听众。您还需要将useCapture的{​​{1}}参数设置为addEventListener()。这将允许您捕获事件并阻止它而不是事件命中对象并冒泡。

true

target.addEventListener(KeyboardEvent.KEY_DOWN, target_onKeyDown, true); 活动中,检查您要处理的某个密钥是否匹配,如果匹配,请致电target_onKeyDownevent.stopImmediatePropagation(),具体取决于你需要做什么。

Flex 3语言参考提供了对事件传播和键盘事件的良好解释:

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

答案 1 :(得分:1)

  1. 将显示的对象添加到屏幕然后开始侦听舞台键盘事件

  2. 从屏幕上删除对象后,删除键盘事件侦听器

  3. 键盘事件的
  4. 过滤您需要的事件:)

  5. 您需要的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我从脑海中编写代码:))

答案 2 :(得分:1)

正确的方法结果是一个全局键盘事件管理器,在调用应用程序的creationComplete事件时作为键向下侦听器添加到舞台。然后,这为每个按键或其组合分派域事件。遗憾的是,过滤每个组件的模型并没有成功。

我将把这个应用程序移植到Cairngorm框架,一旦我完成它就应该可以正常工作。