捕获键盘输入

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

从 InteractiveObject 类继承交互模型的显示对象可以使用事件侦听器来响应键盘事件。例如,您可以将事件侦听器放在舞台上以侦听并响应键盘输入。在以下代码中,事件侦听器捕获一个按键,并显示键名和键控代码属性:

function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace("Key Pressed: " + String.fromCharCode(event.charCode) +         " (character code: " + event.charCode + ")"); 
} 
stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);

有些键(如 Ctrl 键)虽然没有字型表示形式,但也能生成事件。

在上面的代码示例中,键盘事件侦听器捕获了整个舞台的键盘输入。也可以为舞台上的特定显示对象编写事件侦听器;当对象具有焦点时将触发该事件侦听器。

在以下示例中,仅当用户在 TextField 实例内键入内容时,才会在“输出”面板中反映键击。按下 Shift 键可暂时将 TextField 的边框颜色更改为红色。

此代码假定舞台上有一个名为 tf 的 TextField 实例。

tf.border = true; 
tf.type = "input"; 
tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
tf.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp); 
 
function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace("Key Pressed: " + String.fromCharCode(event.charCode) +         " (key code: " + event.keyCode + " character code: "         + event.charCode + ")"); 
    if (event.keyCode == Keyboard.SHIFT) tf.borderColor = 0xFF0000; 
} 
 
function reportKeyUp(event:KeyboardEvent):void 
{ 
    trace("Key Released: " + String.fromCharCode(event.charCode) +         " (key code: " + event.keyCode + " character code: " +         event.charCode + ")"); 
    if (event.keyCode == Keyboard.SHIFT) 
    { 
        tf.borderColor = 0x000000; 
    } 
}

TextField 类还会报告 textInput 事件,当用户输入文本时,您可以侦听该事件。有关详细信息,请参阅 捕获文本输入

注: 在 AIR 运行时中,可以取消键盘事件。在 Flash Player 运行时中,无法取消键盘事件。

键控代码和字符代码

您可以访问键盘事件的 keyCode charCode 属性,以确定按下了哪个键,然后触发其他动作。 keyCode 属性为数值,与键盘上的某个键的值相对应。 charCode 属性是该键在当前字符集中的数值。(默认字符集是 UTF-8,它支持 ASCII。)

键控代码值与字符值之间的主要区别是:键控代码值表示键盘上的特定键(数字键盘上的 1 与最上面一排键中的 1 不同,但生成的“1”键与生成“!”的键是同一个键),字符值表示特定字符(字符 R 与 r 是不同的)。

注: 有关 ASCII 中的键和字符代码值之间的映射,请参阅 用于 Adobe Flash Platform 的 ActionScript 3.0 参考 中的 flash.ui.Keyboard 类。

键与其键控代码之间的映射取决于设备和操作系统。因此,不应使用键映射来触发动作,而应使用 Keyboard 类提供的预定义常量值来引用相应的 keyCode 属性。例如,不要使用 Shift 的键映射,而应使用 Keyboard.SHIFT 常量(如上面的代码范例中所示)。

KeyboardEvent 优先级

与其他事件一样,键盘事件序列是由显示对象的层次决定的,而不是由在代码中分配 addEventListener() 方法的顺序决定的。

例如,假定您将名为 tf 的文本字段放在名为 container 的影片剪辑内,并在这两个实例中添加键盘事件的事件侦听器,如下例所示:

container.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
container.tf.border = true; 
container.tf.type = "input"; 
container.tf.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown); 
 
function reportKeyDown(event:KeyboardEvent):void 
{ 
    trace(event.currentTarget.name + " hears key press: " +         String.fromCharCode(event.charCode) + " (key code: " +         event.keyCode + " character code: " + event.charCode + ")"); 
}

由于文本字段及其父容器上都有侦听器,因此,将为 TextField 内的每次键击调用两次 reportKeyDown() 函数。请注意,对于每次按键操作,文本字段在 container 影片剪辑调度事件之前调度事件。

操作系统和 Web 浏览器先于 Adobe Flash Player 或 AIR 处理键盘事件。例如,在 Microsoft Internet Explorer 中按 Ctrl+W 将先关闭浏览器窗口,然后再由包含的任何 SWF 文件调度键盘事件。