Apache flex Adobe Flex3:视图可见时的键盘快捷键?
我有一个相当大的Flex应用程序,它有一大组视图,我有一些视图,我想添加快捷方式 我在寻找这样的东西:Apache flex Adobe Flex3:视图可见时的键盘快捷键?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我有一个相当大的Flex应用程序,它有一大组视图,我有一些视图,我想添加快捷方式 我在寻找这样的东西: <mx:Vbox> <foo:Shortcut keys="ctrl+s" action="{bar();}"/> .... </mx:VBox> .... 是否有任何框架或组件已经完成,这样做?我想建造起来应该太难了吧?构建此视图时,我只希望视图可见时快捷方式处于活动状态。我如何检测这个?使用非可视组件时,最适合从哪个基类继承?我不认为此解决
<mx:Vbox>
<foo:Shortcut keys="ctrl+s" action="{bar();}"/>
....
</mx:VBox>
....
是否有任何框架或组件已经完成,这样做?我想建造起来应该太难了吧?构建此视图时,我只希望视图可见时快捷方式处于活动状态。我如何检测这个?使用非可视组件时,最适合从哪个基类继承?我不认为此解决方案直接回答了您的问题,但无论如何,为了帮助解决您的问题,这里有一个示例 例如,我像这样扩展了TextArea组件。这是迄今为止我所能做的最好的了,它肯定可以改进。比如,我不知道在按下下一个快捷键后如何使光标移到末尾
public class TextArea extends mx.controls.TextArea
{
// the keysmap is an example dictionary holding keycodes
private var keysmap:*={
112 = "some text for F1"
,113 = "the text for F2!"
//etc, etc
}
public var handleKeyDown:Boolean =false;
public function TextArea(){
if(handleKeyDown ==true){
this.addEventListener(KeyboardEvent.KEY_DOWN,this.keydownHandler);
}
}
public function keydownHandler(e:KeyboardEvent):void{
if(e.keyCode >= 112 && e.keyCode <= 123){
e.currentTarget["text"] += String(keysmap[e.keyCode]) +" ";
}//focusManager.setFocus(this);
}
}
公共类TextArea扩展了mx.controls.TextArea
{
//KeyMap是一个包含键代码的示例字典
专用var密钥映射:*={
112=“F1的一些文本”
,113=“F2的文本!”
//等等等等
}
public var handleKeyDown:Boolean=false;
公共功能文本区域(){
如果(handleKeyDown==true){
this.addEventListener(KeyboardEvent.KEY_DOWN,this.keydownHandler);
}
}
公共函数keydownHandler(e:KeyboardEvent):void{
如果(e.keyCode>=112&&e.keyCode我认为这个解决方案不会直接回答您的问题,但无论如何,这里是一个帮助解决您问题的示例
例如,我已经像这样扩展了TextArea组件。这是迄今为止我所能做的最好的,它肯定可以改进。比如,我不知道如何在按下下一个快捷键后使光标移到末尾
public class TextArea extends mx.controls.TextArea
{
// the keysmap is an example dictionary holding keycodes
private var keysmap:*={
112 = "some text for F1"
,113 = "the text for F2!"
//etc, etc
}
public var handleKeyDown:Boolean =false;
public function TextArea(){
if(handleKeyDown ==true){
this.addEventListener(KeyboardEvent.KEY_DOWN,this.keydownHandler);
}
}
public function keydownHandler(e:KeyboardEvent):void{
if(e.keyCode >= 112 && e.keyCode <= 123){
e.currentTarget["text"] += String(keysmap[e.keyCode]) +" ";
}//focusManager.setFocus(this);
}
}
公共类TextArea扩展了mx.controls.TextArea
{
//KeyMap是一个包含键代码的示例字典
专用var密钥映射:*={
112=“F1的一些文本”
,113=“F2的文本!”
//等等等等
}
public var handleKeyDown:Boolean=false;
公共功能文本区域(){
如果(handleKeyDown==true){
this.addEventListener(KeyboardEvent.KEY_DOWN,this.keydownHandler);
}
}
公共函数keydownHandler(e:KeyboardEvent):void{
如果(e.keyCode>=112&&e.keyCode我无法给出使用MXML的解决方案,但是我的第一个想法是使用一个单例静态类,其中包含一个对象列表作为其键,动态创建的字典作为值对,其中包含表示所需按键的键,函数引用作为值。
因此,假设您有一个Sprite,并且希望在焦点位于该对象上时捕获ctrl+s进行保存,我将获取该Singleton的实例,并调用一个函数,如registerKeyBinding传入Sprite、所需的键代码和预定义回调:
private var registeredObjects:Dictionary = new Dictionary(true);
public function registerKeyBinding(targetObject:Object, keyCode:int, callback:Function) {
if (registeredObjects[targetObject]) {
Dictionary(registeredObjects[targetObject])[keyCode] = callback;
}
else {
registeredObjects[targetObject] = new Dictionary();
Dictionary(registeredObjects[targetObject])[keyCode] = callback;
targetObject.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
}
}
private function keyDownListener(e:KeyboardEvent):void {
if (e.ctrlKey == true) {
//calls the function if that key exists.
Dictionary(registeredObjects[e.target])[e.keyCode];
}
}
不能说我已经测试过了,但这只是第一件突然出现在我脑海中的事情。然后你可以设置函数来取消注册和删除字典中的键,除了键代码之外检查对象的状态,删除旧的侦听器,并在不再需要时删除整个字典。希望这至少是没有一点帮助。我不能给你一个使用MXML的解决方案,但是我的第一个想法是使用一个单例静态类,其中包含一个对象列表作为键,动态创建的字典作为值对,其中包含表示所需按键的键,函数引用作为值
因此,假设您有一个Sprite,并且希望在焦点位于该对象上时捕获ctrl+s进行保存,我将获取该Singleton的实例,并调用一个函数,如registerKeyBinding传入Sprite、所需的键代码和预定义回调:
private var registeredObjects:Dictionary = new Dictionary(true);
public function registerKeyBinding(targetObject:Object, keyCode:int, callback:Function) {
if (registeredObjects[targetObject]) {
Dictionary(registeredObjects[targetObject])[keyCode] = callback;
}
else {
registeredObjects[targetObject] = new Dictionary();
Dictionary(registeredObjects[targetObject])[keyCode] = callback;
targetObject.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
}
}
private function keyDownListener(e:KeyboardEvent):void {
if (e.ctrlKey == true) {
//calls the function if that key exists.
Dictionary(registeredObjects[e.target])[e.keyCode];
}
}
不能说我已经测试过了,但这只是第一件突然出现在我脑海中的事情。然后你可以设置函数来取消注册和删除字典中的键,除了键代码之外检查对象的状态,删除旧的侦听器,并在不再需要时删除整个字典。希望这至少是没有一点帮助。我不知道有哪种框架组件已经做到了这一点,但是如果您尝试构建自己的框架组件,上面的示例应该可以帮助您开始
对于您在这里描述的非可视组件,不需要从任何组件继承(您的“foo”类不需要父级)。Flex框架中没有任何东西需要继承
无论您如何构建,您的foo类都必须接收和解析键盘代码,以侦听和接受一个或多个要调用的方法。您所要做的就是确定何时添加和删除将调用传入方法的事件侦听器
要根据可见性打开和关闭键盘事件,只需将foo组件绑定到其父级的“visible”属性,并相应地添加/删除事件侦听器
您还可以考虑在FoO嵌套的组件在显示列表中而不是仅在可见时添加侦听器。要做到这一点,只需在组件生命周期方法之一中添加和删除事件侦听器,可能是最合适的。我已经说过了,但是如果你想建立你自己的,上面的例子应该会让你开始
对于您在这里描述的非可视组件,不需要从任何组件继承(您的“foo”类不需要父级)。Flex框架中没有任何东西需要继承
不管你如何设计它,你的foo类都必须接受和解析键盘代码来监听和接受一个或多个要调用的方法