Захват действий клавиатуры

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 на красный.

В данном коде в рабочей области присутствует экземпляр TextField с именем tf .

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 см. в описании класса flash.ui.Keyboard в cправочнике ActionScript® 3.0 для платформы Adobe® Flash® Platform .

Связь клавиш с кодами клавиш зависит от устройства и операционной системы. По этой причине не следует использовать назначения клавиш для вызова действий. Вместо этого лучше использовать предопределенные значения констант класса 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 + ")"); 
}

Так как прослушиватель установлен и на текстовое поле, и на его родительский контейнер, функция reportKeyDown() вызывается дважды для каждого нажатия клавиши в текстовом поле TextField. Обратите внимание, что каждый раз при нажатии клавиши текстовое поле отправляет событие прежде, чем это делает фрагмент ролика container .

Операционная система и веб-обозреватель обрабатывают события прежде, чем это делает проигрыватель Adobe Flash Player или AIR. Например, если нажать в обозревателе Internet Explorer сочетание клавиш Ctrl+W, окно обозревателя закроется прежде, чем любой из содержащихся в нем SWF-файлов отправит событие клавиатуры.