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


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



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 — упрощенный класс отображает отладочное сообщение при нажатии любой клавиши.

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



Полезные ссылки
Случайные записи
  • 16.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.24
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.39
  • 17.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.10
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.58
  • 24.02.2011">Руководство по actionscript. часть 7, стр. 008
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.39
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.73
  • 06.03.2011">Руководство по actionscript. часть 4, стр. 135
  • 09.03.2011">Руководство по actionscript. часть 4, стр. 055
  • 14.07.2011">Почему продвижение неизбежно
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 062
  • 01.04.2012">ЕС создаст центр по борьбе с киберпреступностью
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 037
  • 26.02.2011">Руководство по actionscript. часть 6, стр. 050
  • 05.06.2011">Мысли вслух о дачном домике.
Опрос

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

View Results

Loading ... Loading ...