Март 2011
Руководство по actionscript. часть 4, стр. 070
Листинг 22.9. Глобальная обработка событий клавиатуры
package { import flash. display.*; import flash. events.*;
public class GlobalKeyboardSensor extends Sprite { public. function GlobalKeyboardSensor ( ) { // Регистрируем приемник для получения уведомлений о нажатии клавиши stage. addEventLi stener(KeyboardEvent. KEY_D0WN, keyDownLi stener);
}
// Эта функция вызывается всякий раз при нажатии клавиши, когда // приложение Flash Player имеет системный фокус private function keyDownListener (e:KeyboardEvent):void { traceC’A key was pressed.»);
}
}
}
Обработка событий клавиатуры для конкретного объекта
Как видно из табл. 22.3, когда никакой объект не имеет фокуса ввода с клавиатуры, получателем всех событий клавиатуры является экземпляр класса Stage. В отличие от этого, когда экземпляр класса InteractiveObj ect имеет фокус ввода с клавиатуры, данный экземпляр является получателем всех событий клавиатуры, диспетчеризация которых выполняется приложением Flash Player.
Руководство по actionscript. часть 4, стр. 071
Следовательно, чтобы реагировать на клавиатурный ввод, направленный в конкретный объект, мы регистрируем приемники в этом объекте. Это демонстрирует листинг 22.10, в котором показано приложение, создающее два объекта Sprite — recti и rect2. Когда фокус установлен на объекте recti и пользователь нажимает любую клавишу, приложение перемещает обьект recti вправо. Когда фокус установлен на объекте rect2 и пользователь нажимает любую клавишу, приложение вращает объект г ect 2.
Листинг 22.10. Обработка событий клавиатуры для конкретного объекта
package { import flash. display.*; import flash. events.*;
public class ObjectKeyboardSensor extends Sprite { public function ObjectKeyboardSensor ( ) { // Создаем прямоугольники var recti:Sprite = new Sprite( ); recti. graphi cs.1i neSty1e(1); recti. graphics. beginFill(OxOOOOFF); rectt. graphics. drawRect(0. 0, 75, 75); recti. tabEnabled = true;
var rect2:Sprite = new Sprite( ); rect2.graphi cs.1i neSty1e(1);
rect2.graphics. beginFill(OxOOOOFF); rect2.graphics. drawRect(0, 0, 75, 75); rect2.x = 200; rect2.tabEnabled = true;
// Добавляем прямоугольники в список отображения
addChild(rectl);
addChild(rect2);
// Регистрируем приемники в прямоугольниках для событий клавиатуры recti. addEventLi stener(KeyboardEvent. KEYJDOWN, rectlKeyDownLi stener); rect2.addEventLi stener(KeyboardEvent. KEYJDOWN, rect2KeyDownLi stener);
}
// Выполняется, когда фокус установлен на объекте recti и пользователь // нажимает любую клавишу
private function rectlKeyDownListener (e:KeyboardEvent):void { Sprite(e. target).x += 10;
}
// Выполняется, когда фокус установлен на объекте rect2 и пользователь // нажимает любую клавишу
private function rect2KeyDownListener (e:KeyboardEvent)-.void { Sprite(e. target).rotation += 10;
}
}
}
Теперь, когда мы знаем, как определить момент нажатия или отпускания клавиши пользователем, выясним, как можно определить, какая клавиша была нажата или отпущена.
Руководство по actionscript. часть 4, стр. 072
Определение последней нажатой или отпущенной клавиши
Приложение Flash Player присваивает обычный числовой идентификатор, называемый кодом клавиши, всем выбираемым клавишам. Чтобы определить код последней нажатой или отпущенной клавиши, мы получаем значение переменной экземпляра keyCode класса KeyboardEvent в функции-приемнике события KeyboardEvent. KEY_UP или KeyboardEvent. KEY_DOWN, как показано в листинге 22.11.
Листинг 22.11. Получение кода нажатой клавиши
package { import flash. display.*; import flash. events.*; import flash. text.*;
// Отображаем код для любой нажатой клавиши public class KeyViewer extends Sprite {
private var keyoutput:TextField; public function KeyViewer ( ) {
keyoutput = new TextField( );
keyoutput. text = «Press any key…»;
keyoutput. autoSize = TextFieldAutoSize. LEFT;
keyoutput. border = true;
keyoutput. background = true;
addChild(keyoutput);
stage. addEventLi stener(KeyboardEvent. KEYJDOWN, keyDownLi stener);
}
private function keyDownListener (e:KeyboardEvent):void { // Отображаем код для нажатой клавиши
keyoutput. text = «The key code for the key you pressed is: + e. key code;
Чтобы определить момент, когда будет нажата или отпущена определенная клавиша, мы сравниванием ее код со значением переменной экземпляра keyCode класса KeyboardEvent в функции-приемнике событий KeyboardEvent. KEY_UP или KeyboardEvent. KEY_DOWN. Например, следующая функция-приемник события KeyboardEvent. KEY_DOWN определяет момент, когда будет нажата клавиша Esc, путем сравнения ее кода (27) со значением переменной keyCode.
Руководство по actionscript. часть 4, стр. 073
Private function keyDownListener (e:KeyboardEvent):void { if (e. keyCode = 27) { traceCThe Escape key was pressed»);
Коды для всех клавиш управления курсором и клавиш числовой клавиатуры представлены в виде констант класса flash. ui. Keyboard. Приведенный выше код обычно записывается следующим образом (обратите внимание на использование статической переменной ESCAPE класса Keyboard вместо значения литерала 27):
import f1 ash. ui. Keyboard;
private function keyDownListener (e:KeyboardEvent):void { if (e. keyCode = Keyboard. ESCAPE) {
traceCThe Escape key was pressed»);
Коды клавиш зависят от выбранного языка и используемой операционной системы.
1 Список кодов клавиш на клавиатурах с раскладкой U. S. English можно найти по адресу
J, http://livedocs. macromedia. eom/flash/8/main/00001686.html.
При написании выражений для определения момента нажатия или отпускания клавиши, отсутствующей среди констант класса flash. ui. Keyboard, всегда используйте такую последовательность действий.
Руководство по actionscript. часть 4, стр. 074
1. Запустите приложение KeyViewer из листинга 22.11 на компьютере с такой же операционной системой и клавиатурой, как у конечного пользователя.
2. Нажмите желаемую клавишу.
3. Сохраните возвращенный код клавиши в виде константы.
4. Используйте константу, полученную на шаге 3, при определении момента нажатия или отпускания желаемой клавиши.
Предположим, что мы хотим определить момент, когда пользователь нажимает клавишу А на компьютере с операционной системой Mac OS и клавиатурой с раскладкой U. S. English. Мы запускаем приложение KeyViewer и нажимаем клавишу А. В ответ приложение KeyViewer отображает код клавиши — 65. Мы сохраняем этот код в виде константы пользовательского класса, например с именем KeyConstants, как показано в следующем коде:
public static const A_KEY:int = 65;
Затем, чтобы определить момент нажатия клавиши А, мы используем следующий код:
private function keyDownListener (e:KeyboardEvent):void { if (e. keyCode == KeyConstants. A_KEY) { traceCThe A key was pressed»);
}
}
Следующий код демонстрирует описанную методику в контексте очень простого тестового приложения:
package { import flash. display.*; import flash. events.*;
public class AKeySensor extends Sprite { //
public static const A_KEY:int = 65;
public function AKeySensor ( ) { stage. addEventLi stener(KeyboardEvent. KEY_D0WN, keyDownLi stener);
}
private function keyDownListener (e:KeyboardEvent):void { if (e. keyCode == AKeySensor. A_KEY) { traceCThe A key was pressed»);
}
}
}
}
Стоит отметить, что, когда используется редактор методов ввода (IME — Input Method Editor), переменная экземпляра keyCode класса KeyboardEvent не
поддерживается. Дополнительную информацию о редакторах IME можно найти вописании класса flash, system. IME справочника по языку ActionScript корпорации Adobe и в разделе Programming ActionScript 3.0 > Flash Player APIs > Client System Environment > IME class документации корпорации Adobe.
Руководство по actionscript. часть 4, стр. 075
Клавиши, расположенные в нескольких местах. На некоторых клавиатурах определенные клавиши, расположенные в нескольких местах, имеют одинаковые коды. Например, на компьютере с операционной системой Mac OS и клавиатурой с раскладкой U. S. English код клавиши 16 представляет и левую, и правую клавиши Shift; код клавиши 17 представляет и левую, и правую клавиши Ctrl; код клавиши 13 представляет и основную клавишу Enter, и клавишу Enter на числовой клавиатуре. Чтобы отличать подобные клавиши, расположенные в нескольких местах, используется переменная экземпляра keyLocation класса KeyboardEvent, значение которой обозначает логическое положение клавиши, представленное в виде одной из четырех констант класса flash. ui. KeyLocation (LEFT, NUM_PAD, RIGHT и STANDARD). Эту методику демонстрирует следующий код. В нем функция-приемник события KeyboardEvent. KEY DOWN выводит одно отладочное сообщение в момент нажатия левой клавиши Shift, а другое — в момент нажатия правой клавиши Shift:
private function keyDownListener (e:KeyboardEvent):void { if (e. keyCode == Keyboard. SHIFT) { if (e. keyLocation == KeyLocation. LEFT) {
traceCThe left Shift key was pressed»); } else if (e. keyLocation == KeyLocation. RIGHT) { traceCThe right Shift key was pressed»);
}
}
}
Определение одновременного нажатия нескольких клавиш
Чтобы определить нажатие клавиши Shift или Ctrl (клавиша Command на компьютерах Macintosh) в сочетании с любой другой клавишей, мы используем переменные экземпляра shif tKey и ctrlKey класса KeyboardEvent в функции-приемнике события KeyboardEvent. KEY DOWN. Например, следующее простое приложение определяет нажатие сочетания клавиш Ctrl+S (Command+S на компьютерах Macintosh):
package { import flash. display.*; import flash. events.*;
public class CtrlSSensor extends Sprite { public static const S_KEY:int = 83;
public function CtrlSSensor ( ) { stage. addEventLi stener(KeyboardEvent. KEYJDOWN, keyDownLi stener);
}
private function keyDownListener (e:KeyboardEvent):void { if (e. keyCode == CtrlSSensor. S_KEY
*4
&& е. Ctrl Key — true) {
trace(«Ctrl+S was pressed»);
В автономной версии приложения Flash Player и в его версии, реализованной в виде 4 ч модуля расширения браузера, среда выполнения не может определить нажатие клавиши 4 За4 Alt (и клавиши F10).
Руководство по actionscript. часть 4, стр. 076
Чтобы определить одновременное нажатие двух или более обычных клавиш, не являющихся Shift и Ctrl, мы должны вручную отслеживать текущее состояние каждой клавиши. Эту методику демонстрирует следующий код. В нем приложение отображает отладочное сообщение, когда происходит одновременное нажатие клавиш <— и т. подобный код может использоваться для поворота автомобиля или для перемещения по диагонали космического корабля в компьютерной игре.
package { import flash. display.*; import flash. events.*; import flash. ui.*;
// Определяет одновременное нажатие клавиш «стрелка вверх» и «стрелка влево» public class UpLeftSensor extends Sprite {
// Отслеживает состояние стрелки «вверх»
// (true, когда нажата; false в противном случае)
private var upPressed:Boolean;
// Отслеживает состояние стрелки «влево»
// (true, когда нажата; false в противном случае)
private var leftPressed:Boolean;
public function UpLeftSensor ( ) { //-Регистрируем приемники для событий клавиатуры stage. addEventLi stener(KeyboardEvent. KEYJDOWN, keyDownLi stener); stage. addEventLi stener(KeyboardEvent. KEY_UP, keyUpLi stener);
}
// Обрабатывает события KeyboardEvent. KEYJDOWN private function keyDownListener (e:KeyboardEvent):void { // Делаем пометку, была ли нажата клавиша «стрелка вверх» или «стрелка влево» if (е. keyCode == Keyboard. UP) {
upPressed = true; } else if (e. keyCode == Keyboard. LEFTJ { leftPressed = true;
}
// Если клавиши «стрелка вверх» и «стрелка влево» были нажаты одновременно… if (upPressed && leftPressed) {
// …выполняем определенное действие, например поворачиваем
// космический корабль по диагонали вверх и влево
traceCUp Arrow key and Left Arrow key are both pressed»);
}
}
// Обрабатывает события KeyboardEvent. KEYJJP private function keyUpListener (e;KeyboardEvent):void { // Делаем пометку, была ли отпущена клавиша «стрелка вверх» // или «стрелка влево» if (е. keyCode == Keyboard. UP) {
upPressed = false; } else if (e. keyCode == Keyboard. LEFT) { leftPressed = false;
}
}
}
События мыши и клавиши-модификаторы
Подобно тому как язык ActionScript позволяет легко проверить, были ли нажаты клавиши Shift или Ctrl в процессе диспетчеризации события ввода с клавиатуры, он также дает возможность узнать, были ли нажаты клавиши Shift или Ctrl в процессе диспетчеризации события ввода с помощью мыши. Для этого внутри функции-приемника, зарегистрированной для данного события, используются переменные экземпляра shif tKey и ctrlKey класса MouseEvent. Например, следующий код выводит отладочное сообщение, когда происходит щелчок кнопкой мыши при нажатой клавише Shift. Подобный код может быть использован в программе рисования для ограничения перемещения объекта по горизонтальной или вертикальной оси.
Руководство по actionscript. часть 4, стр. 077
Package { import flash. display.*; import flash. events.*;
public class ControlClickSensor extends Sprite { public function ControlClickSensor ( ) { stage. addEventListener(MouseEvent. CLICK, clickListener);
}
private function clickListener (e;MouseEvent):void { if (e. shiftKey) { traceCShift+click detected»);
}
}
}
}
Определение символа, связанного с клавишей
Ранее рассказывалось, как можно определить код последней нажатой или отпущенной клавиши. Чтобы получить фактический символ, связанный с последней
нажатой или отпущенной клавишей, мы проверяем значение переменной экземпляра charCode класса KeyboardEvent внутри функции-приемника события KeyboardEvent. KEY_UP или KeyboardEvent. KEY_DOWN.
Руководство по actionscript. часть 4, стр. 078
Когда используется клавиатура с раскладкой U. S. English, значение переменной charCode представляет код символа из таблицы ASCII, который логически соответствует последней нажатой или отпущенной клавише. В некоторых случаях для одной и той же клавиши переменная charCode может принимать два возможных значения в зависимости от того, была ли нажата клавиша Shift. Например, код символа для клавиши S на клавиатуре с раскладкой U. S. English соответствует значению 115 при отпущенной клавише Shift и значению 83 при нажатой клавише Shift. Для клавиш, у которых нет соответствующих отображаемых символов в таблице ASCII, переменной KeyboardEvent. charCode устанавливается значение 0.
Когда используется клавиатура с другой раскладкой, отличной от раскладки U. S. English, значение переменной charCode представляет код символа в таблице ASCII для эквивалентной клавиши на клавиатуре с раскладкой U. S. English. Например, на японской клавиатуре для клавиши с иероглифом t3> которая находится в той же позиции, что и клавиша А на клавиатуре с раскладкой U. S. English, переменная charCode будет по-прежнему возвращать либо значение 97, либо значение 65 (символы «а» и «А» из таблицы ASCII соответственно), но не значение 12 385 (кодовая точка Unicode для иероглифа t=>).
Чтобы преобразовать код символа в фактическую строку, используется метод экземпляра f romCharCode ( ) класса String. Эта методика продемонстрирована в листинге 22.12 — измененный класс KeyViewer (который был представлен ранее в листинге 22.11) отображает символ, связанный с последней нажатой клавишей.
Листинг 22.12. Получение кода клавиши и кода символа нажатой клавиши
package { import flash. display.*; import flash. events.*; import flash. text.*; import flash. ui.*;
// Отображает код клавиши и код символа для любой нажатой клавиши public class KeyViewer extends Sprite { private var keyoutput:TextField; public function KeyViewer ( ) {
keyoutput = new TextField( );
keyoutput. text = «Press any key…»;
keyoutput. autoSize = TextFieldAutoSize. LEFT;
keyoutput. border = true;
keyoutput. background = true;
addChild(keyoutput);
stage. addEventLi stener(KeyboardEvent. KEY_D0WN, keyDownLi stener);
}
private function keyDownListener (e:KeyboardEvent):void { keyoutput. text = «The key code for the key you pressed is; «
+ е. keyCode + «\п»; keyoutput. appendText(«The character code for the key you pressed is: «
+ e. charCode + «\n»); keyoutput. appendText(«The character for the key you pressed is: «
+ String. fromCharCode(e. charCode)):
}
}
}
Результат выполнения приложения KeyViewer из листинга 22.12 для нажатой клавиши S на клавиатуре с раскладкой U. S. English выглядит следующим образом:
The key code for the key you pressed is: 83
The character code for the key you pressed is: 115
The character for the key you pressed is: s
Результат выполнения приложения KeyViewer из листинга 22.12 для нажатой клавиши Shift в сочетании с клавишей S на клавиатуре с раскладкой U. S. English выглядит следующим образом:
The key code for the key you pressed is: 83
The character code for the key you pressed is: 83
The character for the key you pressed is: S
Как и в случае с переменной экземпляра keyCode класса KeyboardEvent, переменная charCode не поддерживается, если используется редактор методов ввода, и не предназначена для использования в качестве средства получения вводимых текстовых данных. Для получения вводимых текстовых данных применяется событие TextEvent. TEXT INPUT совместно с объектом TextField, которые рассматриваются в следующем разделе.
Руководство по actionscript. часть 4, стр. 079
События текстового ввода
Приложение Flash Player выполняет диспетчеризацию событий текстового ввода в следующих ситуациях:
? когда пользователь добавляет новый текст в поле;
? когда пользователь активизирует гипертекстовую ссылку протокола event: в поле (щелкая кнопкой мыши на этой ссылке);
? когда происходит прокрутка текстового поля либо программным путем, либо пользователем.
В табл. 22.4 перечислены типы внутренних событий текстового ввода приложения Flash Player. Для каждого типа события столбец «Тип события» содержит константу класса, представляющую официальное строковое название типа события. В столбце «Описание» указывается конкретное действие пользователя, приводящее к возникновению этого события. Столбец «Получатель» описывает объект, который выступает в роли получателя события при его диспетчеризации. В столбце «Поведение по умолчанию» приводится стандартная реакция приложения Flash Player на данное событие. Столбец «Всплывает» содержит информацию о том,
имеет ли данное событие фазу всплытия. Наконец, столбец «Тип данных объекта, передаваемого в функцию-приемник» определяет тип данных объекта, передаваемого в функцию-приемник, обрабатывающую данное событие.
Таблица 22.4. События текстового ввода приложения Flash Player
Тип события Описание Получатель Поведение по умолчанию Всплывает Тип данных объекта, передаваемого в функцию-приемник
TextEvent. TEXTJNPUT Пользователь попытался добавить новый текст в поле Объект TextField, в который пользователь попытался добавить новый текст Текст добавляется в поле. Данное поведение по умолчанию может быть отменено методом экземпляра preventDefault() класса Event Да TextEvent
Event. CHANGE Новый текст был добавлен пользователем в поле Объект TextField, в который был добавлен новый текст Отсутствует Да Event
Event. SCROLL Произошла прокрутка поля либо программным путем, либо пользователем Объект TextField, в котором произошла прокрутка Отсутствует Нет Event
TextEvent. LINK Активизирована гипертекстовая ссылка протокола event: Объект TextField, содержащий активизированную ссылку Отсутствует Да TextEvent
Подобно событиям мыши, клавиатуры и фокуса, событие текстового ввода может обрабатываться приемниками, зарегистрированными в получателе события или в любом отображаемом предке данного получателя. Тем не менее в следующих разделах мы сосредоточимся только на использовании приемников, зарегистрированных в получателе события.