Работа с клавиатурой

Реагировать на нажатие определенных клавиш можно было еще в первых версиях Flash. Тогда носителем этой возможности было особое событие кнопок keyPress. Оно позволяло «отлавливать» нажатие клавиш символов, а также некоторых служебных клавиш. Пример:

on(keyPress "A") {
trace("Клавиша А нажата");

Событие keyPress может быть использовано и во Flash MX 2004. Однако делать этого не стоит, так как еще во Flash 5 появились куда более мощные элементы, позволяющие обрабатывать нажатие кнопок клавиатуры. Их носителем является специальный встроенный объект Key. Ему присущи 2 события, 4 метода и 18 свойств.

Особенности событий клавиатуры
Сообщения о нажатии или отпускании клавиш клавиатуры передаются в Flash-плейер лишь в том случае, если он находится в фокусе. Иначе — их получает активное в данный момент приложение.

Конечно, это не может вызвать никаких затруднений, если фильм проигрывается в отдельном окне плейера. Сложности могут возникнуть, если swf-фильм встроен в HTML-страницу. При открытии такой страницы в фокусе будет находиться браузер, а не плейер. Соответственно поступать в фильм информация о нажатых клавишах не будет.
Решить описанную проблему можно двумя способами:

• Создать специальную кнопку, без нажатия которой фильм не начинал бы проигрываться.
Щелкнув по этой кнопке, пользователь переведет фокус с браузера на плейер.


Данный подход приемлем в случае игр,

• Перевести на фильм фокус можно и автоматически, используя метод focus() JavaScript. Данный способ оптимален в случае сайтов.

У Flash-плейера, как практически у любой программы, есть свои «горячие» клавиши и сочетания.

Они управляют основными опциями плейера и дают команды проигрываемому фильму. Например, перевести фильм в полноэкранный режим можно, нажав + . Чтобы выйти из него, нужно задействовать клавишу <Еsс>, и т.д. При нажатии «горячей» клавиши или сочетания информация о том, что были задействованы определенные кнопки, в фильм не поступает. Так, если вы нажмете , то события onKeyDown не будет. При нажатии + будет зарегистрировано только опускание клавиши .

Если в фильме активно применяется управление с клавиатуры, то наличие «горячих» клавиш и сочетаний может быть нежелательным (например, клавишу удобно использовать как закрывающую игру или презентацию). Чтобы отключить их поддержку, нужно набрать следующую строчку:

fscommand("trapallkeys", "true");

К сожалению, невозможно блокировать «горячие» сочетания операционной системы и браузера.

Так, нажав + , вы сделаете активным окно другого открытого приложения.




<АН> +
закроет окно плейера. Нажатие <Таb> в случае встроенного в HTML-страницу фильма может привести к снятию с него фокуса. «Отловить» нажатие , если фильм проигрывается в браузере, в принципе невозможно.

Ввиду того что отключить некоторые «горячие» сочетания нельзя, специальные кнопки лучше вообще не использовать в проектах. Особенно это касается клавиш и <Таb>. Собственные «горячие» сочетания и клавиши присущи и среде тестирования Flash. По этой причине, например, в ней невозможно произвести клавиатурный обход при помощи клавиши <Таb> или «отловить» нажатие . Чтобы блокировать использование служебных клавиш и сочетаний, задействуйте настройку Disable Keyboards Shortcuts меню Control. Кстати, это единственный способ решить эту задачу, так как команды fscommand() в среде тестирования не действуют.

События onKeyDown и onKeyUp
Событие onKeyDown происходит при нажатии пользователем клавиши клавиатуры. Соответственно событие onKeyUp возникает, если клавиша отпускается. Чтобы некоторый объект получал сообщения о данных событиях, он должен быть добавлен в список листенеров объекта Key. Сделать это можно при помощи метода add List ener():

var obj:Object = {};
Key.addListener(obj);
// При нажатии любой кнопки сообщение появится в Output
obj.onKeyDown = function():Void {
trace("Былa нажата кнопка");
};

Удалить объект из списка листенеров объекта Key можно, используя метод removeListener().


Модель событий Flash 5 не позволяла сделать генератором или листенером событий произвольный объект. Они тогда были присуши только клипам и кнопкам. События нажатия и отпускания клавиш клавиатуры «слушались» по умолчанию всеми клипами. Это же мы можем наблюдать и сейчас, создавая обработчики в стиле Flash 5:

onClipEvent(keyDown) { // При нажатия любей клавиши клип исчезнет
this._visible=false;
}

Итак, при применении старой модели событий клипам изначально доступны события клавиатуры.

Однако если использовать обработчики-методы, то окажется, что по умолчанию клипы не являются листенерами событий onKeyDown и onKeyUp;

this.createEmptyMovieClip("clip", 0);
// Нажатие клавиш не Судет сопровождаться появлением сообщения
clip.onKeyDown = function():Void {
trace("Клавиша нажата!");
};

To, что одно и то же событие, но в разной форме записи, ведет себя по-разному, выглядит, по меньшей мере, странно. Особенно, если учитывать, что разработчики Flash стремились сделать две модели событий максимально схожими. Поэкспериментировав, можно обнаружить, что клипы все же могут «слушать» события onKeyDown и onKeyUp, но лишь в том случае, если они находятся в фокусе:

// Создаем клип с именем в виде кружочка
clip.focusEnabled = true; // Делаем клип выделяемым
Selection.setFocus(clip); // Наводим на клип фокус
// Нажатие кнопки приведет к увеличению клипа в два раза
clip.onKeyDown = function():Void {
this._xscale = this._yscale *= 2;
}

Хотя в фокусе клипам доступны события onKeyDown и onKeyUp, вряд ли это может быть хоть как-то использовано на практике. И дело даже не в раздражающей желтой рамке, которая окружает выделенный клип — ее отображение с легкостью можно отключить. Просто фокус, даже если его навести на клип n нужный момент программно, используя метод setFocus() объекта Selection, может просто не успеть выполнить возложенные на него функции. При малейшем движении мыши он исчезнет. То же произойдет, если будет нажата кнопка мыши или клавиша пробела или ввода.

Поскольку клипам события onKeyDown и onKeyUp присущи только в исключительно редкой ситуации наличия фокуса, вполне можно считать, что они не являются листенерами данных событий. Поэтому, если необходимо, чтобы клип получал сообщения о событиях клавиатуры, он должен быть явно занесен в список листенеров объекта Key при помощи метода addListener(). To же самое справедливо и для кнопок (во Flash MX 2004 у них появились события onKeyDown и onKeyUp).

На первый взгляд, событие клавиатуры onKeyDown чрезвычайно схоже с событием мыши onMouseDown. Однако между ними имеется принципиальное отличие. Событие onMouseDown происходит один раз при нажатии левой кнопки мыши. При этом не имеет значения, была ли она отпущена сразу, или же удерживалась относительно продолжительное время. Событие же onKeyDown при удерживании клавиши будет повторяться с достаточно высокой частотой до тех пор, пока она не будет отпущена. Количество событий onKeyDown будет определяться настройками операционной системы пользователя и может в среднем составлять от 30 до 10 событий в секунду.

В том случае, если одновременно было нажато несколько клавиш, индивидуальные события onKeyDown и onKeyUp произойдут для каждой из них.

Используя события onKeyDown и onKeyUp, можно узнать лишь то, что какая-то из кнопок была нажата или отпущена. Какая же именно это была кнопка, определяется при помощи методов getCode() и getAscii() объекта Key. Их описание приведено ниже.

Определение кода нажатой клавиши. Метод getCode()
Подумаем, как могут адресоваться клавиши клавиатуры. Наверное, самый очевидный вариант — по вводимым ими символам. Например, если на кнопке нарисована буква «А», то ею и должна обозначаться эта клавиша. Однако такой подход порождает массу проблем. Как обозначать служебные клавиши, которым не соответствуют символы? Как учесть, что в разных странах одни и те же клавиши могут задавать разные символы? Что делать, если в разных раскладках кнопка вводит разные символы? Как учесть наличие числовой клавиатуры?

Очевидно, что адресация по вводимому клавишей символу не универсальна. Гораздо лучше дать каждой кнопке стандартный номер исходя из ее положения. А какой она будет задавать символ и будет л и задавать вообще — это второстепенно.

В Windows для каждой клавиши имеется стандартный код, присваиваемый ей исходя из ее физического расположения. Например, на стандартной клавиатуре клавиши с числами от 0 до 9 занимают интервал кодов от 48 до 57, клавиша имеет номер 13, <Таb> — 9, — 17. Интересно, что коды клавиш от А до Z и от 0 до 9 совпадают с занимаемыми ими позициями в кодировках семейства ASCII.

В ActionScript определить код нажатой последней клавиши можно, используя метод getCode()
объекта Key. Например:

Key.addListener(this);
// При нажатии в Output будет выведено сообщение
this.onKeyDown = function():Void {
if (Key.getCode() == 13) {
trace("Клавиша нажата");
}
};

Если клавиш нажато не было, метод getCode() возвращает 0.

Метод getCode() неразрывно связан с событиями onKeyDown и onKeyUp. Действительно, не имеет смысла применять его вне их обработчиков, так как он показывает, какая кнопка была задействована последней безо всякого лимита на отдаленность этого события.

Возвращаемое getCode() значение не зависит от того, какая раскладка или регистр были активны.

Например, введению и латинской «F», и русской «а» будет соответствовать один код — 70. Если необходимо среагировать не на нажатие определенной клавиши, а на добавление конкретного символа, то нужно использовать метод getAscii().

По сравнению с методом getAscii(), у метода getCode() есть важные преимущества. Так, он позволяет определять нажатие не только клавиш символов, но и всех служебных клавиш. С его помощью можно различать, была ли задействована кнопка цифры или арифметической операции на основной или числовой клавиатуре. Метод getCode() интернационален: один и тот же код будет адресовать одну и ту же клавишу вне зависимости от того, какая кодовая страница используется компьютером пользователя. Также данный метод платформенное зависимый; при проигрывании фильма на машинах Macintosh коды клавиш будут автоматически переводиться в Windows-эквивалентные.

В число виртуальных клавиш Windows входят и кнопки мыши (им соответствуют коды 1 и 2). Однако определять факт их нажатия метод getCode() не может. Если существует подобная необходимость (например, нужно создать событие правого Щелчка), то воспользуйтесь методом isDown(),

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Контекстное меню
Определение кода введенного символа. Метод getAscii()
Проверка активности специальных режимов. Метод isToggled()
Проверка нажатия клавиши. Метод isDown()
Работа с мышью