Март 2011

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

Упражнение для читателя. Попробуйте добавить новый код в листинг 22.2, который регистрирует приемники для всех событий, перечисленных в табл. 22.1. В качестве шаблона используйте код, описывающий и регистрирующий приемник для события MouseEvent. MOUSE_MOVE. Следующий код, который требуется для регистрации приемника события MouseEvent. MOUSE_DOWN (первое событие, перечисленное в табл. 22.1), поможет вам начать.

// Добавьте этот код. регистрирующий приемник события, в конструктор класса tri anglе. addEventLi stener(MouseEvent. MOUSEJDOWN. mouseDownLi stener);

// Добавьте этот код. описывающий приемник, в тело класса private function mouseDownListener (e:MouseEvent):void { trace(«mouse down»);

}

События мыши и перекрывающиеся отображаемые объекты

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

Например, если объект TextField визуально перекрывает объект Sprite и пользователь щелкает кнопкой мыши на объекте TextField, приложение Flash Player выполняет диспетчеризацию события MouseEvent. CLICK, получателем которого является только объект TextField. Объект Sprite не получает уведомления о том, что произошел щелчок кнопкой мыши.

В листинге 22.3 представлено простое приложение, которое демонстрирует предыдущий сценарий «объект TextField над объектом Sprite». Основной класс приложения ClickSensor регистрирует приемник clickListener ( ) для события MouseEvent. CLICK в объекте Sprite — circle. Объект Sprite частично перекрывается объектом TextField — textfield. Когда вызывается метод clickListener ( ), происходит перемещение объекта circle на 10 пикселов вправо.

Листинг 22.3. Приемник событий мыши, зарегистрированный в частично перекрытом объекте

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

public class ClickSensor extends Sprite { public function ClickSensor ( ) { // Создаем круг

var circle:Sprite = new Sprite( );

ci rcle. graphi cs. begi nFi11 (0×999999. 1);

ci rclе. graphi cs.1ineSty1e(1);

circle. graphics. drawEllipse(0. 0. 100. 100);

// Создаем объект TextField

var textfield;TextField = new TextFieldC );

textfield. text = «Click here»;

textfield. autoSize = TextFieldAutoSize. LEFT;

textfield. x = 30;

textfield. у = 30;

textfield. border = true;

textfield. background = true;

// Добавляем объект circle в список отображения addChild(circle);

// Добавляем объект textfield в список отображения.

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

// поверх объекта circle

addChild(textfield);

// Регистрируем приемник для получения уведомлений. // когда пользователь щелкает кнопкой мыши на круге ci rclе. addEventLi stener(MouseEvent. CLICK, cli ckLi stener);

}

// Обрабатывает события MouseEvent. CLICK, получателем которых является // объект circle.

private function clickListener (e:MouseEvent):void { traceCUser clicked: » + e. target); DisplayObject(e. target).x += 10;

}

}

}

На рис. 22.1 показан результат выполнения кода из листинга 22.3.

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

Рис. 22.1. Результат выполнения приложения ClickSensor

Если при выполнении приложения ClickSensor пользователь щелкнет кнопкой мыши на видимой части объекта circle, этот объект сместится вправо. Но если пользователь щелкнет кнопкой мыши на части объекта circle, которая перекрыта объектом textfield, объект circle не получит уведомления о возникновении события MouseEvent. CLICK и, следовательно, не будет смещен.

Однако существует возможность сделать так, чтобы объект textfield игнорировал любые события мыши, тем самым позволяя объекту circle определять щелчки

кнопкой мыши даже в тех местах, которые перекрыты объектом textfield. Чтобы объект textfield игнорировал все события мыши, мы присваиваем его переменной mouseEnabled значение false, как показано в следующем коде:

textfield. mouseEnabled = false;

Если бы эта строка кода была добавлена в метод-конструктор класса ClickSensor, все щелчки кнопкой мыши, происходящие над любой частью объекта circle, — видимой или невидимой, — приводили бы к перемещению объекта circle вправо.

Когда переменной mouseEnabled экземпляра класса InteractiveObject присвоено значение f al se, этот экземпляр не получает никаких уведомлений о возникновении событий мыши. Вместо этого события мыши отправляются следующему самому верхнему экземпляру класса InteractiveObj ect в списке отображения, для которого включена возможность обработки таких событий.

Определение позиции указателя мыши

Как было рассказано ранее, когда приложение Flash Player вызывает функцию-приемник события мыши, оно передает в эту функцию объект MouseEvent. Он хранит текущую позицию указателя мыши в следующих переменных экземпляра:

? localXHlocalY;

? stageX и stageY.

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



Полезные ссылки
Случайные записи
  • 03.02.2010">Создание графиков и диаграмм на JavaScript
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 024
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 089
  • 17.03.2011">Руководство по actionscript. часть 3, стр. 003
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 070
  • 05.08.2011">Вентиляция помещения необходима для здоровья и продуктивности работников
  • 24.02.2011">Руководство по actionscript. часть 7, стр. 006
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 050
  • 19.07.2012">На серверах Dropbox произошла утечка адресов e-mail
  • 18.07.2010">Лучшие модули для сайта
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 057
  • 14.07.2011">Как скачать музыку из контакта
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.119
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 117
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 020
Опрос

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

View Results

Loading ... Loading ...