我想安排一些事情,以便在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键是主要的例子;在一些情况下,即使焦点在文本字段上,我也希望我的key down事件处理程序触发。
发布于 2009-09-09 22:15:20
正确的方法是使用全局键盘事件管理器,在调用应用程序的creationComplete事件时将其作为按键侦听器添加到舞台上。然后为每个按键或其组合分发域事件。遗憾的是,按组件过滤的模型不起作用。
我将把这个应用程序移植到凯恩戈姆框架,一旦我完成了,它应该会工作得很好。
发布于 2009-07-31 20:55:44
按照现在设置伪代码的方式,您必须子类化所有不同的容器,并为每个容器添加一个handles_key属性。您可能希望将该功能外部化到一个单独的类中,如下所示:
<KeyHandler target="{tab1}" handlesKeys="pgup,left,right"/>至于实际捕获事件,您需要在您想要侦听的UIComponent上添加一个KeyboardEvent.KEY_DOWN侦听器。您还需要将addEventListener()的useCapture参数设置为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
发布于 2009-07-31 21:17:53
您需要的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我是根据自己的想法编写代码的:)
https://stackoverflow.com/questions/1213110
复制相似问题