Руководство по 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

Подобно событиям мыши, клавиатуры и фокуса, событие текстового ввода может обрабатываться приемниками, зарегистрированными в получателе события или в любом отображаемом предке данного получателя. Тем не менее в следующих разделах мы сосредоточимся только на использовании приемников, зарегистрированных в получателе события.

Руководство по actionscript. часть 4, стр. 080

Поближе познакомимся с четырьмя событиями, представленными в табл. 22.4.

События TextEventJEXTJNPUT и Event. CHANGE

События TextEvent. TEXT_INPUT и Event. CHANGE позволяют определить новый введенный пользователем текст. В частности, эти события могут возникать в результате использования таких методик, предназначенных для ввода текста, как:

? нажатие клавиши;

? вставка текста с помощью специальных сочетаний клавиш или встроенного контекстного меню приложения Flash Player (открываемого щелчком вспомогательной (правой) кнопки мыши);

? ввод текста через программное обеспечение для распознавания речи;

? создание текстового содержимого в редакторе методов ввода.

Событие TextEvent. TEXT_INPUT сообщает о том, что пользователь пытается добавить новый текст в поле, и дает приложению возможность либо пресечь эту попытку, либо разрешить ее. Это событие предоставляет удобный способ для обращения к текстовому содержимому, добавляемому в текстовое поле, до того как оно на самом деле будет добавлено туда. В отличие от этого, событие Event. CHANGE сообщает о том, что попытка пользователя добавить новый текст в поле завершилась успешно и приложение Flash Player соответствующим образом обновило содержимое данного текстового поля.

Обобщенный код, необходимый для регистрации приемника в объекте TextField для события TextEvent. TEXT_INPUT, выглядит следующим образом:

обьектТехЬПе Id. addEventLi stener (TextEvent. TEXT_INPUT. textlnputListener) ;

Обобщенный код для приемника события TextEvent. TEXT_INPUT выглядит следующим образом:

private function textlnputListener (e:TextEvent):void { }

Чтобы предотвратить отображение введенного пользователем текста в объекте TextField, иcпoльзyeтcямeтoдэкзeмпляpapreventDefault ( ) KziaccaEvent, как показано в следующем коде:

private function textlnputListener (e:TextEvent):void { // Предотвращаем отображение введенного пользователем текста на экране e. preventDefault( );

}

Для обращения к тексту, введенному пользователем, применяется переменная экземпляра text класса TextEvent, как показано в следующем коде:

private function textlnputListener (e:TextEvent):void { // Выводим отладочное сообщение, содержащее введенный пользователем текст trace(е. text);

}

Событие TextEvent. TEXT INPUT может быть использовано для автоматического форматирования вводимых пользователем данных при заполнении анкет в приложении, как показано в листинге 22.13. В этом примере весь текст, введенный в поле, преобразуется в верхний регистр. Подобный код может быть использован в разделе «адрес доставки» формы, с помощью которой оформляется заказ товара через Интернет.

Руководство по actionscript. часть 4, стр. 081

•Листинг 22.13. Преобразование введенного пользователем текста в верхний регистр

package { import flash. display.*; import flash. events.*; import flash. text.*;

public class UppercaseConverter extends Sprite { private var inputfield:TextField;

public function UppercaseConverter ( ) { inputfield = new TextField( );

inputfield. text = «»;

inputfield. width = 150;

inputfield. height = 30;

inputfield. border = true;

inputfield. background = true;

inputfield. type = TextFieldType. INPUT;

addChild(inputfield);

// Регистрируем приемник в объекте inputfield // для событий TextEvent. TEXTJNPUT

i nputfi eld. addEventLi stener(TextEvent. TEXT_INPUT. textInputLi stener);

}

// Вызывается всякий раз. когда пользователь пытается добавить новый // текст в объект inputfield

private function textlnputListener (e:TextEvent):void { // Предотвращаем добавление введенного пользователем текста // в поле

e. preventDefault( );

// Добавляем в поле эквивалентный символ верхнего регистра inputfi eld. replaceText(i nputfi eld. caret Index.

Руководство по actionscript. часть 4, стр. 082

Inputfield. caretlndex.

e. text. toUpperCase( )); // Устанавливаем точку ввода (знак вставки) в конец нового текста. // чтобы пользователь думал, что это он ввел данный текст var newCaret Index:int = inputfield. caretlndex + e. text. length; inputfield. setSelection(newCaretlndex, newCaretIndex);

}

}

}

Теперь перейдем к событию Event. CHANGE. Обобщенный код, необходимый для регистрации приемника в объекте TextField для события Event. CHANGE, выглядит следующим образом:

opbeKTTextField. addEventLi stener(Event. CHANGE. changeListener);

Обобщенный код для приемника события Event. CHANGE выглядит таким образом:

private function changeListener (e:Event):void { }

Событие Event. CHANGE может быть использовано для синхронизации содержимого двух текстовых полей, как показано в листинге 22.14. Здесь представлен фрагмент из гипотетического элемента управления «панель», содержащего помеченные фотографии. Для простоты код из листинга позволяет добавлять только метку фотографии без соответствующего изображения. В коде событие Event. CHANGE применяется для обновления строки заголовка панели в соответствии с названием текущей выбранной фотографии. Для обзора в этом коде также используются события FocusEvent. FOCUS_IN и FocusEvent. FOCUS_OUT, чтобы обновлять заголовок панели, когда пользователь меняет фокус в приложении.



Полезные ссылки
Случайные записи
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 005
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 064
  • 12.03.2011">Руководство по actionscript. часть 3, стр. 132
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.43
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 005
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 089
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.52
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 049
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 101
  • 23.07.2011">Каждая квартира достойна уникального дизайна
  • 03.08.2011">Поэт-революционер — новое собрание сочинений
  • 26.02.2011">Руководство по actionscript. часть 6, стр. 051
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.97
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 027
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 100
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...