Экранные объекты, которые наследуют модели взаимодействия от класса 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» — разные символы).
Связь клавиш с кодами клавиш зависит от устройства и операционной системы. По этой причине не следует использовать назначения клавиш для вызова действий. Вместо этого лучше использовать предопределенные значения констант класса 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-файлов отправит событие клавиатуры.