Flex 监听键盘组合键的方法

KeyboardEvent 是 Flex 中的键盘事件,有两种类型:KeyboardEvent.KEY_DOWN 和 KeyboardEvent.KEY_UP ,它们和其他事件的发生、处理过程相同,但要处理组合事件时需要特别的处理。
我们在完成注册验证功能时,需要在注册页面通过组合键调出输入验证码的区域,暂时把组合键定为:ctrl + shift + c。要监听组合键事件,主要步骤如下:
1> 监听特定的按键
当我们在程序中添加键盘事件的监听后,可以监听到任意的按键动作,在每个出发的 event 中,都保存了按键的信息,例如:
altKey : Boolean
在 Windows 中,指示 Alt 键是处于活动状态 (true) 还是非活动状态 (false);在 Mac OS 中,指示 Option 键是否处于活动状态。

charCode : uint
包含按下或释放的键的字符代码值。

commandKey : Boolean
指示 Command 键是处于活动状态 (true) 还是非活动状态 (false)。

controlKey : Boolean
指示 Ctrl 键是处于活动状态 (true) 还是非活动状态 (false)。

ctrlKey : Boolean
在 Windows 中,指示 Ctrl 键是处于活动状态 (true) 还是非活动状态 (false);在 Mac OS 中,指示 Ctrl 键或 Command 键是否处于活动状态。

keyCode : uint
按下或释放的键的键控代码值。

keyLocation : uint
指示键在键盘上的位置。

shiftKey : Boolean
指示 Shift 功能键是处于活动状态 (true) 还是非活动状态 (false)。

可以现在下面的程序里实验出 ctrl 、 shift 、 c 各自的 keyCode 分别为 17、16、67。
private function appComplete():void{
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,myKeyDown);
}

private function myKeyDown(evt:KeyboardEvent):void{
t1.text += '\nevt.charCode='+evt.charCode + '\nevt.keyCode='+ evt.keyCode + '\nevt.keyLocation='+ evt.keyLocation + "按下\n";
}
..................

2> 监听组合的按键
知道要监听的 keyCode 后,可以设置三个初始为 false 的 Boolean 变量记录三个键的 press or up 的情况,当监听到 KEY_DOWN 事件时,判断是否为三个键之一被按下,若是则设置相应的值为 true ,末尾判断是否三个键都被按下;若是监听到 KEY_UP 事件,判断是否为三个键之一被放开,若是则设置相应的值为 false。
值得注意的是,按住某个键会不停触发 KEY_DOWN 事件,不能简单的在判断成功后把 bool 值取反,具体做法可看最后的代码。

3> 监听到组合键时的处理方法
Handler 方法和其它事件的相同,组合键监听方法示例如下(myPress方法既完成工作,其它两个方法只用来显示):

<?xml version="1.0" encoding="utf-8"?>


import flash.events.KeyboardEvent;

private var key1:Boolean = false;
private var key2:Boolean = false;
private var key3:Boolean = false;

private function appComplete():void{
this.stage.addEventListener(KeyboardEvent.KEY_UP,myKeyUp);
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,myKeyDown);
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,myPress);
}

private function myKeyUp(evt:KeyboardEvent):void{
//t1.text+= 'evt.charCode='+evt.charCode + '\nevt.keyCode='+ evt.keyCode + '\nevt.keyLocation='+ evt.keyLocation + " 弹起\n"
// t1.text+="\nup"+evt.keyCode;
if (evt.keyCode == 17) {
key1 = false;
t1.text += "\n key1 up";
}
if (evt.keyCode == 16) key2 = false;
if (evt.keyCode == 67) {
key3 = false;
t1.text += "\n key3 up";
}
}

private function myKeyDown(evt:KeyboardEvent):void{
t1.text += '\nevt.charCode='+evt.charCode + '\nevt.keyCode='+ evt.keyCode + '\nevt.keyLocation='+ evt.keyLocation + "按下\n";
t1.text += '\n --- evt.ctrlKey='+evt.ctrlKey;
t1.text += ' --- evt.altKey='+evt.altKey;
t1.text += ' --- evt.shiftKey='+evt.shiftKey;
}

//下面方法演示每次按下上下左右键头,文本框移动+5像素;
private function myPress(evt:KeyboardEvent):void{
if (evt.keyCode == 17 && key1 == false) {
key1 = true;
t1.text += "\n key1 press";
}
if (evt.keyCode == 16 && key2 == false) {
key2 = true;
t1.text += "\n key2 press";
}
if (evt.keyCode == 67 && key3 == false) {
key3 = true;
t1.text += "\n key3 press";
}
if (key1 == true && key2 == true && key3 == true) t2.text += "\nsuccess";

// if(evt.keyCode==39){ //右
// t2.x += t2.x+5;
// }
// if(evt.keyCode==38){//上
// t2.y += t2.y-5;
// }
// if(evt.keyCode==40){//下
// t2.y += t2.y+5;
// }
// if(evt.keyCode==37){//左
// t2.x += t2.x-5;
// }
}

]]>



相关连接:http://livedocs.adobe.com/flex/3_cn/
http://hi.baidu.com/artgou/blog/item/4998d5d6fd16922607088be3.html

posted @ 2010-11-03 17:02 子福当自强 阅读(...) 评论(...) 编辑 收藏
悟道2012