Март 2011
Руководство по actionscript. часть 4, стр. 060
Когда кнопка мыши нажимается над «пустым» участком области отображения приложения Flash Player (то есть над участком, где отсутствуют созданные программой отображаемые объекты), получателем события является экземпляр класса Stage. Когда нажатие кнопки мыши происходит над любым другим отображаемым объектом, получателем события является этот объект. Таким образом, проверяя получателя события в методе mouseDownListener ( ), мы можем создать код, ко-
торый реагирует именно на нажатие кнопки мыши над пустыми участками области отображения приложения Flash Player. Описанную методику демонстрирует следующее приложение CircleClicker. Когда пользователь щелкает кнопкой мыши на пустом участке области отображения Flash Player, приложение CircleClicker рисует круг случайного размера и закрашивает его случайным цветом. Когда же пользователь щелкает кнопкой мыши на круге, приложение CircleClicker удаляет этот круг с экрана.
package { import flash. display.*; import flash. events.*;
public class CircleClicker extends Sprite { public function CircleClicker ( ) { stage. addEventLi stener(MouseEvent. CLICK. cli ckLi stener);
}
private function clickListener (e:MouseEvent):void { // Если получателем события является экземпляр класса Stage, if (е. target == stage) {
// …рисуем круг
drawCirclе(е. stageX. е. stageY); } else {
// …в противном случае получателем события должен являться // объект Sprite, содержащий круг, поэтому удаляем данный объект removeChi1d(Di splayObj ect(e. ta rget));
}
}
public function drawCircle (x:int. y:int):void { var randomColor:int = Math. floor(Math. random( )*0xFFFFFF); var randomSize:int = 10 + Math. floor(Math. random( )*150); var circle:Sprite = new Sprite( ) ci rcle. graphi cs. begi nFi11(randomColor. 1); circle. graphics. lineStyle( );
circle. graphics. drawEl1ipse(0. 0. randomSize. randomSize); circle. x = x-randomSize/2; circle. у = y-randomSize/2; addChild(circle);
}
}
}
Стоит отметить, что по соображениям безопасности загруженному SWF-файлу может быть запрещено обращаться к экземпляру класса Stage приложения Flash Player. В подобных ситуациях для «глобальной» обработки событий мыши применяйте методики, описанные в разд. «Обработка событий между границами зон безопасности» гл. 12.
Руководство по actionscript. часть 4, стр. 061
Теперь перейдем к рассмотрению другого типа событий ввода — событий, возникающих в результате смены фокуса.
События фокуса
Когда объект получает фокус ввода с клавиатуры, он выступает в роли логического приемника всех введенных с клавиатуры данных и становится получателем всех событий клавиатурного ввода. Объект может получить фокус ввода с клавиатуры либо программным путем (через переменную экземпляра focus класса Stage), либо в результате взаимодействия с пользователем посредством мыши, клавиши Tab или клавиш управления курсором. Однако для получения фокуса ввода с клавиатуры объект должен быть экземпляром класса, который наследуется от класса InteractiveObject. Более того, в приложении Flash Player фокус ввода с клавиатуры единовременно может иметь только один объект.
Чтобы установить фокус на объект программным путем, мы присваиваем этот объект переменной focus экземпляра класса Stage.
Например, следующий код создает объект Sprite и затем немедленно устанавливает на него фокус (предполагается, что объект someDisplayContainer находится в списке отображения):
var rect:Sprite = new Sprite( ); rect. graphi cs.1ineSty1e(1): rect. graphics. begi nFi11 (OxOOOOFF): rect. graphics. drawRectCO. 0, 150. 75): someDi splayContai ner. addChi1d(rect): someDisplayContainer. stage. focus = rect;
При выполнении предыдущего кода объект rect получает фокус и, следовательно, становится получателем всех возникающих событий клавиатурного ввода.
Установка фокуса на объекты с помощью клавиатуры
Чтобы установить фокус на объект с помощью клавиатуры, пользователь нажимает клавишу Tab или клавиши управления курсором. Тем не менее, чтобы объект мог получать фокус с помощью указанных клавиш, он должен быть частью порядка перехода приложения Flash Player. Порядок перехода — это набор всех объектов, находящихся в списке отображения, которые теоретически могут получать фокус ввода с помощью клавиатуры. Порядок перехода также определяет последовательность, в которой объекты получают фокус при нажатии пользователем клавиши
В приложении Flash Player существует два различных порядка перехода: автоматический и пользовательский. Автоматический порядок перехода — это порядок перехода, который используется приложением Flash Player по умолчанию, когда не
Для краткости вместо термина «фокус ввода с клавиатуры» обычно используется сокращенный термин «фокус».
Руководство по actionscript. часть 4, стр. 062
Установка фокуса на объекты программным путем
Tab.
определен пользовательский порядок перехода. Автоматический порядок перехода включает следующие объекты:
? экземпляры класса TextField, находящиеся в списке отображения и переменной type которых присвоено значение TextFieldType. INPUT;
? экземпляры классов Sprite или MovieClip, находящиеся в списке отображения и у которых переменной buttonMode или tabEnabled присвоено значение true;
? экземпляры класса SimpleBitton, которые находятся в списке отображения.
Когда используется автоматический порядок перехода и пользователь нажимает клавишу Tab, фокус перемещается от одного объекта к другому в автоматическом порядке перехода. Последовательность автоматического порядка перехода приложения Flash Player определяется местоположением содержащихся в нем объектов — визуально перемещение фокуса происходит слева направо и затем сверху вниз (независимо от позиции этих объектов в иерархии отображения).
В отличие от автоматического, пользовательский порядок — это порядок перехода, определяемый программным путем и включающий произвольную последовательность объектов, переменной tab Index которых присвоено неотрицательное целое число. В пользовательский порядок перехода могут быть включены следующие типы объектов:
? экземпляры класса TextField, переменной type которых присвоено значение TextFieldType. INPUT;
? экземпляры классов Sprite, MovieClip или SimpleButton.
Руководство по actionscript. часть 4, стр. 063
Когда по крайней мере одному находящемуся в настоящий момент в списке отображения объекта переменной tablndex присвоено значение 0 или большее, применяется пользовательский порядок перехода. В этом случае нажатие клавиши Tab приводит к установке фокуса на объекты в соответствии со значением их переменной tablndex, начиная с минимального значения и заканчивая максимальным.
Например, если у объекта, имеющего фокус в настоящий момент, переменной tablndex присвоено значение 2 и пользователь нажимает клавишу Tab, фокус устанавливается на объект, переменной tablndex которого присвоено значение 3. Если снова нажать клавишу Tab, фокус будет установлен на объект, переменной tablndex которого присвоено значение 4, и т. д. Если переменной tablndex двух объектов присвоено одно и то же значение, то в порядке перехода первым окажется объект с меньшей глубиной. Объекты, переменной tablndex которых значение не присвоено явно, исключаются из порядка перехода.
Независимо от того, какой порядок перехода используется в данный момент — автоматический или пользовательский, — когда фокус устанавливается на экземпляр класса Sprite, MovieClip или SimpleButton клавишей Tab, пользователь в дальнейшем может работать четырьмя клавишами для управления курсором, чтобы установить фокус на объект, расположенный в указанном направлении (сверху, снизу, слева или справа).
Чтобы исключить объект из автоматического или пользовательского порядка перехода, мы присваиваем переменной tabEnabled этого объекта значение false. Объекты, переменной _visible которых присвоено значение false, автоматически исключаются из порядка перехода. Чтобы исключить всех потомков некоторого контейнера отображаемых объектов из автоматического или пользовательского порядка перехода, мы присваиваем переменной tabChi ldren этого контейнера значение false.
По умолчанию приложение Flash Player отображает желтый прямоугольник вокруг экземпляров классов Sprite, MovieClip или SimpleButton, если фокус был установлен с помощью клавиатуры. Чтобы отключить отображение желтого прямоугольника для конкретного объекта, мы присваиваем его переменной focusRect значение false. Если нужно отключить отображение желтого прямоугольника для всех объектов, мы присваиваем переменной stageFocusRect экземпляра класса Stage значение false. Стоит отметить, что значение переменной stageFocusRect не отражается на значении переменной focusRect отдельных объектов. Тем не менее присваивание значения переменной focusRect конкретного объекта перекрывает значение переменной stageFocusRect.
Установка фокуса на объекты с помощью мыши
Подобно тому как пользователь может устанавливать фокус ввода с клавиатуры, используя клавишу Tab или клавиши управления курсором, он может устанавливать фокус, щелкая на объекте кнопкой мыши. Однако по умолчанию с помощью мыши устанавливать фокус можно только на экземпляры классов SimpleButton и TextField. Чтобы предоставить пользователю возможность устанавливать фокус на экземпляры классов Sprite или MovieClip с помощью мыши, используется один из следующих подходов:
? присвоить переменной buttonMode этого экземпляра значение true (убедившись, что его переменной tabEnabled явным образом не присвоено значение false);
? переменной tabEnabled этого экземпляра установить значение true;
? присвоить неотрицательное целое число переменной tabl ndex этого экземпляра (убедившись, что его переменной tabEnabled явным образом не присвоено значение false).
Руководство по actionscript. часть 4, стр. 064
Например, следующий код создает объект Sprite, который получает фокус ввода с клавиатуры, когда на нем щелкают кнопкой мыши:
var rect:Sprite = new Sprite( ): rect. graphi cs.1i neSty1e(1): rect. graphics. beginFill(OxOOOOFF): rect. graphics. drawRect(0, 0, 150, 75); rect. tabEnabled = true;
Чтобы исключить установку фокуса на некоторый объект с помощью мыши, мы присваиваем переменной mouseEnabled этого объекта значение false. Чтобы исключить установку фокуса на потомков контейнера отображаемых
объектов, мы присваиваем переменной mouseChildren этого контейнера значение false.
^ I На объект нельзя установить фокус с помощью мыши, если переменной mouseEnabled А. т этого объекта присвоено значение false или если этот объект является отображае-ц>У мым потомком контейнера, переменной mouseChildren которого присвоено значение
false.
Более того, когда переменной tabEnabled экземпляра класса Sprite, MovieClip или SimpleButton явным образом присваивается значение false, на этот экземпляр невозможно установить фокус с помощью мыши. Подобным образом, когда экземпляр класса Sprite, MovieClip или SimpleButton является потомком контейнера, переменной tabChildren которого присвоено значение false, на этот экземпляр невозможно установить фокус с помощью мыши. Тем не менее из-за ошибки в приложении Flash Player, даже если переменной tabEnabled объекта TextField будет явным образом присвоено значение f al se, на этот объект можно установить фокус с помощью мыши. Подобным образом из-за той же ошибки, даже если переменной tabChildren контейнера, потомком которого является объект TextField, будет присвоено значение false, на этот объект все равно можно установить фокус с помощью мыши.
Установка фокуса на потомков через одного предка. Чтобы среда Flash считала контейнер отображаемых объектов и всех его потомков одной группой, которая может получать фокус одним щелчком кнопкой мыши, выполните следующие шаги.
1. Включите возможность установки фокуса с помощью мыши для данного контейнера, присвоив его переменной buttonMode или tabEnabled значение true либо переменной tablndex любое неотрицательное целое число.
Руководство по actionscript. часть 4, стр. 065
2. Отключите для дочерних объектов этого контейнера возможность взаимодействия с мышью, присвоив его переменной mouseChildren значение false.
События фокуса приложения Flash Player
Когда фокус ввода с клавиатуры приложения переходит на новый объект (с использованием одного из способов, описанных в трех предыдущих разделах), приложение Flash Player выполняет диспетчеризацию одного или нескольких событий фокуса, определяющих данный переход. В табл. 22.2 перечислены типы внутренних событий фокуса приложения Flash Player. Для каждого типа события столбец «Тип события» содержит константу класса FocusEvent, представляющую официальное строковое название типа события. В столбце «Описание» указывается конкретное действие пользователя, приводящее к возникновению этого события. Столбец «Получатель» описывает объект, который выступает в роли получателя события при его диспетчеризации. Столбец «Поведение по умолчанию» описывает стандартную реакцию приложения Flash Player на данное событие. Столбец «Всплывает» содержит информацию о том, имеет ли данное событие фазу всплытия. Наконец, столбец «Тип данных объекта, передаваемого в функцию-приемник» определяет тип данных объекта, передаваемого в функцию-приемник, обрабатывающую данное событие.
х 2
о
- — « X 5 I я и я1 =
Н о с а с
н
я
2 с; с
2
X Z
5
1
3
(г Ш — х Z з
о) п
s х? 5
JP. о с:
го vo
I о
^ ? с
5 QJ П)
mis
2 ш
си
ю гг
0j
мм
Mil
-9-vS
|1S
§ аш
- О CD
Ь 3 §.
Руководство по actionscript. часть 4, стр. 066
vo ф
ill
- го к ш а]
го С
go
Ml
с z и и ш р s nil
о 4—ш
К f г fe
6 я Ъ о
ни
. S
го га
Is
‘*й S 2 |,5
5 5 1/1
с z и и ш р s т и-
1 Я i -9-
И
S го J — го
blip
ГО g Z Ф
g щ и g 8
1*1 ill
Si
О I X
Ills
и о ш.-cr f
«1-
и s
X
8
s
e
О
ro t
si|
л q О vo m )s
ill
6 5
4»
vo
* n ^
sis
о ro л
2 ? Ё
S I
о 2
8 Ё? 1 *
3 S ^ э
<=; с i 2 э
о о и с j
н 2 vo
<
X
HZ
ш и
i?
!3 J
LL ^
3
.3
ш ш
il
Как видно из табл. 22.2, события FocusEvent. FOCUS_IN и FocusEvent. FOCUS_OUT используются для определения момента, когда объект получаст или теряет фокус. На тот момент, когда происходит диспетчеризация этих собып изменение фокуса уже произошло. В отличие от этого, события FocusEvent. KEY FOCUS CHANGE и FocusEvent. MOUSE_FOCUS_CHANGE применяются для определения момента, когда объект собирается получить или потерять фокус, но еще не получил или не потерял его. Приложение обычно использует события FocusEvent. KEY FOCUS CHANGE и FocusEvent. MOUSE_FOCUS_CHANGE, чтобы исключить изменение фокуса пользователем с помощью клавиатуры или мыши, — возможно, чтобы заставить пользователя взаимодействовать с определенной частью интерфейса, например с модальным диалогом.
Руководство по actionscript. часть 4, стр. 067
Как и в случае с событиями мыши, в приложении Flash Player отсутствуют настоящие глобальные события фокуса. Тем не менее, зарегистрировав приемник для событий фокуса в экземпляре класса Stage, мы можем обрабатывать все изменения фокуса, которые происходят в приложении Flash Player. Эта методика продемонстрирована в листинге 22.7 — приложение создает два объекта TextField и, когда на них устанавливается фокус, меняет цвет их фона на зеленый.
Листинг 22.7. Глобальная обработка событий фокуса
package { import flash. display.*; import flash. events.*; import flash. text.*;
public class GlobalFocusSensor extends Sprite { public function GlobalFocusSensor ( ) { // Создаем текстовые поля var fieldl:TextField = new TextField( ); fieldl. width = 100; fieldl. height = 30; fieldl. border = true; fieldl. background = true: fieldl. type = TextFieldType. INPUT;
var field2:TextField = new TextField( );
field2.width = 100;
field2.height = 30;
field2.y = 50;
field2.border = true;
field2.background = true; ,
field2.type = TextFieldType. INPUT;
// Добавляем текстовые поля в список отображения
addChild(fieldl);
addChild(field2);
// Регистрируем приемник для событий FocusEvent. F0CUS_IN stage. addEventLi stener(FocusEvent. F0CUS_IN, focusInLi stener);
// Обрабатываем все события FocusEvent. F0CUS_IN в данном приложении private function focusInListener (е:FocusEvent):void {
// Изменяем цвет фона объекта TextField, на который был установлен
// фокус, на зеленый
TextField(e. target).backgroundColor = OxFFOOFFOO;
// Изменяем цвет фона объекта TextField. потерявшего фокус, на белый if (e. relatedObject is TextField) { TextField(e. relatedObject).backgroundColor = OxFFFFFFFF;
}
}
}
}
События фокуса могут также обрабатываться приемниками, зарегистрированными в объекте-получателе события или в любом из отображаемых предков объекта-получателя события. В листинге 22.8 показано приложение, которое создает объект TextField, не позволяющий сменить фокус (после того как он был установлен) до тех пор, пока не будет введено по крайней мере три символа. Подобный код часто применяется в приложениях, которые проверяют данные, введенные через заполняемые формы, например через экран регистрации или форму заказа товара.
Руководство по actionscript. часть 4, стр. 068
Листинг 22.8. Обработка событий фокуса для конкретного объекта
package { import flash. display.*; import flash. events.*; import flash. text.*;
// Демонстрирует, как обрабатывать события FocusEvent. F0CUS_IN для
// отдельного объекта. Создает объект TextField, который после получения
// фокуса не позволяет его сменить до тех пор. пока не будет введено
// по крайней мере три символа.
public class ObjectFocusSensor extends Sprite {
private var namefield:TextField;
private var passfield:TextField;
public function ObjectFocusSensor ( ) { // Создаем текстовые поля namefield = new TextField( );
namefield. width = 100; namefield. height = 30; namefield. border = true; namefield. background = true; namefield. type = TextFieldType. INPUT;
passfield = new TextField( ); passfield. width = 100; passfield. height = 30; passfield. у = 50;
passfield. border = true;
passfield. background = true; passfield. type = TextFieldType. INPUT;
// Добавляем текстовые поля в список отображения addChi1dCnamefield); addChi1dCpassfield);
// Регистрируем приемник для событий изменения фокуса namefi eld. addEventLi stener(FocusEvent. MOUSE_FOCUS_CHANGE,
focusChangeListener); namefi el d. addEventLi stener(FocusEvent. KEY_FOCUS_CHANGE,
focusChangeListener);
}
// Обрабатывает все события изменения фокуса, получателем которых // является объе’кт namefield
private function focusChangeListener (e:FocusEvent):void { if (e. target == namefield && namefield. text. length < 3) { tracec'name entered is less than three characters long"); e.preventdefault( );
}
}
}
События ввода с клавиатуры
Приложение Flash Player выполняет диспетчеризацию событий ввода с клавиатуры, когда пользователь нажимает или отпускает клавишу. Вообще говоря, события ввода с клавиатуры обычно используются для инициирования ответного действия либо от всего приложения, либо от определенного элемента интерфейса. Например, нажатие клавиши S может вызывать глобальную команду сохранения пользовательских данных, а нажатие стрелки i может выбирать элемент в конкретном компоненте меню.
Руководство по actionscript. часть 4, стр. 069
События ввода с клавиатуры, которые вызывают команды для всего приложения, обычно обрабатываются глобально с помощью приемников, зарегистрированных в экземпляре класса Stage приложения Flash Player. В отличие от этого, события ввода с клавиатуры, инициирующие ответное действие для конкретного элемента интерфейса, обычно обрабатываются приемниками, зарегистрированными в объекте, который на настоящий момент имеет фокус ввода с клавиатуры.
События ввода с клавиатуры приложения Flash Player предназначены для использования при разработке приложений, управляемых с помощью клавиатуры, но не подходят для реакции на ввод текста в объекты TextField. Для реакции на ввод текста применяйте событие TextEvent. TEXT_INPUT, которое рассматривается далее, в разд. «События текстового ввода».
В табл. 22.3 перечислены типы внутренних событий клавиатуры приложения Flash Player. Для каждого типа события столбец «Тип события» содержит константу класса KeyboardEvent, представляющую официальное строковое название типа события. Столбец «Описание» определяет конкретное действие пользователя, приводящее к возникновению этого события. Столбец «Получатель» описывает объект, который выступает в роли получателя события при его диспетчеризации. В столбце «Поведение по умолчанию» приводится стандартная реакция приложения Flash Player на данное событие. В отличие от событий мыши и событий фокуса, у событий клавиатуры отсутствует поведение по умолчанию. Столбец «Всплывает» содержит информацию о том, имеет ли данное событие фазу всплытия. Наконец, столбец «Тип данных объекта, передаваемого в функцию-приемник» определяет тип данных объекта, передаваемого в функцию-приемник, обрабатывающую данное событие.
Стоит отметить, что диспетчеризация событий клавиатуры осуществляется только тогда, когда Flash Player имеет системный фокус. Чтобы получать уведомления о получении или потере системного фокуса приложением Flash Player, зарегистрируйте приемник для событий Event. ACTIVATE и Event. DEACTIVATE (которые рассматриваются далее, в разд. «События ввода уровня приложения Flash Player»).
Таблица 22.3. События клавиатуры приложения Flash Player
Тип события Описание Получатель Поведение по умолчанию Всплывает Тип данных объекта, передаваемого в функцию-приемник
KeyboardEvent. KEY_DOWN Клавиша нажата Объект InteractiveObject, имеющий фокус ввода с клавиатуры, либо, если никакой объект не имеет фокуса, экземпляр класса Stage Отсутствует Да KeyboardEvent
KeyboardEvent. KEY_UP Клавиша отпущена Объект InteractiveObject, имеющий фокус ввода с клавиатуры, либо, если никакой объект не имеет фокуса, экземпляр класса Stage Отсутствует Да KeyboardEvent
Глобальная обработка событий клавиатуры
Как и в случае с событиями мыши и фокуса, в приложении Flash Player отсутствуют настоящие глобальные события клавиатуры. Тем не менее, зарегистрировав приемник для событий клавиатуры в экземпляре класса Stage, можно обрабатывать все взаимодействия с клавиатурой, которые происходят в приложении Flash Player, когда оно имеет системный фокус. Эта методика продемонстрирована в листинге 22.9 — упрощенный класс отображает отладочное сообщение при нажатии любой клавиши.