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

Листинг 22.5. Пользовательский указатель мыши

package { import flash. display.*; import flash. ui.*; import flash. events.*; import flash. geom.*;

// Отображаемый класс, который заменяет указатель мыши новым изображением. // Когда объект CustomMousePointer добавляется в список отображения, он

// автоматически скрывает системный указатель и начинает следовать за его // позицией. Когда объект CustomMousePointer удаляется из списка // отображения, он автоматически восстанавливает системный указатель мыши, public class CustomMousePointer extends Sprite { // Конструктор

public function CustomMousePointer ( ) { // Создаем синий треугольник, который будем применять в качестве // пользовательского указателя мыши graphics. lineStyle(l); graphics. beginFill(OxOOOOFF. 1); graphics. lineTo(15. 5); graphics. lineTo(5. 15); graphics. lineTo(0. 0); graphics. endFi11( );

// Регистрируем приемник для получения уведомлений, когда этот объект // добавляется в список отображения или удаляется из него (требуется // пользовательский вспомогательный класс StageDetector) var StageDetector:StageDetector = new StageDetector(this); StageDetector. addEventListener(StageDetector. ADDED_TO_STAGE.

addedToStageListener); StageDetector. addEventListener(StageDetector. REMOVED_FROM_STAGE.

removedFromStageListener);

}

// Обрабатывает события StageDetector. ADDED_TO_STAGE private function addedToStageListener (e:Event):void {

// Прячем системный указатель мыши

Mouse. hide( );

// Регистрируем приемник для получения уведомлений, когда системный // указатель мыши перемещается над областью отображения приложения // Flash Player или выходит за ее пределы

stage. addEventLi stener(MouseEvent. M0USE_M0VE. mouseMoveLi stener); stage. addEventLi stener(Event. M0USE_LEAVE. mouseLeaveLi stener);

}

// Обрабатываем события StageDetector. REM0VED_FR0M_STAGE private function removedFromStageListener (e:Event):void { // Отображаем системный указатель мыши

Mouse. show( );

// Отменяем регистрацию приемников для событий мыши в экземпляре // класса Stage

stage. removeEventLi stener(MouseEvent. M0USE_M0VE. mouseMoveLi stener); stage. removeEventLi stener(Event. M0USE_LEAVE. mouseLeaveLi stener);

}

// Обрабатываем события Event. M0USE_LEAVE

private function mouseLeaveListener (e:Event):void {

// Когда мышь выходит за пределы области отображения приложения Flash // Player, прячем пользовательский указатель. В противном случае // пользовательский указатель мыши и системный указатель мыши будут // отображаться на экране одновременно, visible = false;

}

// Обрабатывает события MouseEvent. M0USE_M0VE

private function mouseMoveListener (e:MouseEvent):void {

// При перемещении мыши обновляем позицию пользовательского указателя.

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

// чтобы она соответствовала позиции системного указателя.

// (Информацию по преобразованию точек между координатными

// пространствами можно найти в описании метода

// DisplayObject. globalToLocal( ) в справочнике по языку ActionScript

// корпорации Adobe).

var pointlnParent:Point = parent. globalToLocal(new PointCe. stageX.

e. stageY));

x = pointlnParent. x; у = pointlnParent. у;

// Запрашиваем постсобытийное обновление экрана, чтобы анимация // указателя была максимально плавной. Дополнительную информацию // о методе MouseEvent. updateAfterEvent( ) можно найти в гл. 23. e. updateAfterEvent( );

// Возникло событие MouseEvent. M0USE_M0VE. поэтому системный указатель // должен находиться внутри области отображения приложения Flash // Player. Таким образом, убеждаемся, что пользовательский указатель // мыши отображается на экране (он может быть скрыт, поскольку // системный указатель мог покидать пределы области отображения // приложения Flash Player). Здесь этот код расположен неудачно -// он по праву принадлежит событию Event. MOUSE_ENTER. однако // в приложении Flash Player 9 такого события не существует, if С «visible) { visible = true;

}

}

}

}

В листинге 22.6 представлен простой тестовый класс, который демонстрирует использование класса CustomMousePointer из листинга 22.5.

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

Листинг 22.6. Демонстрационный класс, представляющий использование класса CustomMousePointer

package { import flash. display.*;

// Демонстрирует использование класса CustomMousePointer public class CustomMousePointerDemo extends Sprite { private var pointer-.CustomMousePointer;

// Конструктор

public function CustomMousePointerDemo ( ) { // Создаем новый объект CustomMousePointer и добавляем его в список // отображения. В результате добавления объекта CustomMousePointer // в список отображения системный указатель мыши автоматически // заменяется объектом CustomMousePointer. pointer = new CustomMousePointer( ); addChild(pointer);

}

}

}

Упражнение для читателя. Попытайтесь восстановить цепочку выполнения, которая начинается в конструкторе класса CustomMousePointerDemo из листинга 22.6 и завершается вызовом метода экземпляра addedToStageLi stener ( ) класса CustomMousePointer. В некоторый момент времени вам потребуется мысленно выполнить код класса StageDetector из гл. 20, что поможет получить более глубокие знания по API отображения и списку отображения. Ниже перечислены семь первых шагов в цепочке выполнения, которые помогут вам начать.

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

1. Создаем новый объект CustomMousePointer.

2. Выполняем метод-конструктор объекта CustomMousePointer, созданного на шаге 1.

3. Рисуем синий треугольник в объекте CustomMousePointer.

4. Создаем новый объект StageDetector, передавая в его конструктор объект CustomMousePointer.

5. Вызываем метод setWatchedOb j ect ( ) объекта StageDetector, передавая объект CustomMousePointer в качестве его единственного аргумента.

6. Присваиваем объект CustomMousePointer переменной watchedOb j ect объекта StageDetector.

7. Значение переменной watchedObject. stage равняется null (поскольку объект CustomMousePointer на настоящий момент не находится в списке отображения), поэтому переменной onstage объекта StageDetector присваиваем значение false.

Вы можете продолжить цепочку выполнения с этого момента. Желаем приятного времяпрепровождения!

Мысленное выполнение кода — это хороший способ понять, как работает программа.

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

«Глобальная» обработка событий мыши

В приложении Flash Player отсутствуют настоящие глобальные события мыши. Однако, зарегистрировав приемник событий мыши в экземпляре класса Stage, мы можем обрабатывать взаимодействия с мышью независимо от того, где они произошли в пределах области отображения приложения. Например, следующий

код регистрирует метод mouseMoveListener ( ) в экземпляре класса Stage для событий MouseEvent. MOUSE_MOVE:

package { import flash. display.*: import flash. events.*:

public class GlobalMouseMotionSensor extends Sprite { public function GlobalMouseMotionSensor ( ) { stage. addEventLi stener(MouseEvent. M0USE_M0VE, mouseMoveLi stener):

}

private function mouseMoveListener (e:MouseEvent):void { traceCThe mouse moved.»):

}

}

}

Всякий раз, когда при выполнении предыдущего кода указатель мыши перемещается над областью отображения Flash Player, приложение осуществляет диспетчеризацию события MouseEvent. MOUSE MOVE, в результате чего вызывается метод mouseMoveListener ( ).

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

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

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

public class GlobalMouseDownSensor extends Sprite { public function GlobalMouseDownSensor ( ) { stage. addEventLi stener(MouseEvent. M0USE_D0WN. mouseDownLi stener);

}

private function mouseDownListener (e:MouseEvent);void { traceCThe primary mouse button was pressed.»);

}

}

}

Всякий раз, когда при выполнении предыдущего кода нажимается основная кнопка мыши и при этом указатель находится над областью отображения Flash Player, приложение осуществляет диспетчеризацию события MouseEvent. MOUSE_DOWN, в результате чего вызывается метод mouseDownListener ( ).

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



Полезные ссылки
Случайные записи
  • 07.08.2012">Google улучшила PageSpeed, чтобы люди не тратили драгоценные секунды
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 097
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 056
  • 12.04.2011">Photoshop для начинающих: как вставить фото в готовую рамку?
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 090
  • 08.09.2011">Есть ли предел у интернета?
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.121
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.48
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 156
  • 31.07.2011">Выбери свой онлайн-фоторедактор
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 108
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 044
  • 23.02.2012">Pirate Bay обещает уйти в подполье
  • 03.09.2011">Parental Skype Recorder
  • 25.02.2011">Руководство по actionscript. часть 6, стр. 100
Опрос

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

View Results

Loading ... Loading ...