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

Переменные localXnlocalY представляют позицию указателя мыши в координатном пространстве получателя события (то есть относительно левого верхнего угла получателя события). В то же время переменные stageX и stageY представляют позицию указателя мыши в координатном пространстве экземпляра класса Stage (то есть относительно левого верхнего угла экземпляра класса Stage).

В листинге 22.4 демонстрируется использование переменных localX, localY, stageX и stageY. Здесь мы создаем объект TextField, добавляем его непосредственно в экземпляр класса St age и затем размещаем его в позиции с координатами (100; 100). Когда пользователь щелкает кнопкой мыши на объекте TextField, мы выводим позицию указателя мыши относительно этого объекта (то есть получателя события) и относительно экземпляра класса Stage. Например, если пользователь щелкнет кнопкой мыши в точке, которая находится на 10 пикселов правее и 20 пикселов ниже левого верхнего угла объекта TextField, результат будет выглядеть следующим образом:

Position in TextField’s coordinate space: (10. 20) Position in Stage instance’s coordinate space: (110. 120)

Вот этот код:

Листинг 22.4. Определение позиции указателя мыши

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

public class MousePositionChecker extends Sprite { public function MousePositionChecker ( ) { // Создаем объект TextField var textfield:TextField = new TextFieldC ); textfield. text = «Click here»: textfield. autoSize = TextFieldAutoSize. LEFT: textfield. x = 100; textfield. у = 100;

// Добавляем объект textfield в список отображения в качестве // непосредственного ребенка экземпляра класса Stage stage. addChi1d(textfield);

// Регистрируем приемник в объекте textfield // для событий щелчка кнопкой мыши

textfi eld. addEventLi stener(MouseEvent. CLICK. cli ckLi stener);

}

// Когда пользователь щелкает кнопкой мыши на объекте textfield. // отображаем позицию указателя мыши private function clickListener (e:MouseEvent):void { // Позиция указателя мыши относительно объекта TextField trace(«Position in TextField’s coordinate space: («

+ e. localX + «. » + e. localY + «)»); // Позиция указателя мыши относительно экземпляра класса Stage trace(«Position in Stage instance’s coordinate space: (» + e. stageX + «. » + e. stageY + «)»);

}

}

}

Обновляя позицию объекта в ответ на изменения позиции мыши, мы можем сделать так, чтобы этот объект следовал за мышью. В листинге 22.5 представлен код на языке ActionScript 3.0, реализующий пользовательский указатель мыши. В данном листинге применяются многие методики, с которыми мы познакомились на протяжении этой книги. В частности, код из листинга использует класс StageDetector, рассмотренный в подразд. «События ADDED_TO_STAGE и REMOVED_FROM_STAGE» разд. «События контейнеров» гл. 20. В листинге также применяются две методики, которые мы еще не рассматривали: преобразование координат и постсобытийные обновления экрана. Перекрестные ссылки на дополнительную информацию указаны в комментариях.

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



Полезные ссылки
Случайные записи
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 095
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.91
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 085
  • 29.07.2011">Каждому дачному участку – по садовому домику
  • 28.02.2011">Руководство по actionscript. часть 5, стр. 140
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 041
  • 12.03.2011">Руководство по actionscript. часть 3, стр. 133
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 100
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.109
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.116
  • 04.06.2011">О дизайне веб-сайта
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 127
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.5
  • 16.03.2011">Руководство по actionscript. часть 3, стр. 028
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.48
Опрос

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

View Results

Loading ... Loading ...