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

2. Далее мы создаем функцию clickListener ( ), которая будет получать уведомления о возникновении событий MouseEvent. CLICK. Будьте внимательны: типом данных параметра функции clickListener ( ) является MouseEvent.

private function clickListener (e:MouseEvent):void { trace(«Mouse was clicked»);

}

3. Далее в соответствии с информацией в столбце «Получатель» табл. 22.1 мы определяем, что получателем события MouseClick. CLICK является объект InteractiveObj ect, на котором пользователь щелкнул кнопкой мыши. Мы хотим знать, когда щелкают на объекте theTextField, поэтому наш приемник события должен быть зарегистрирован либо в объекте theTextField, либо в одном из его отображаемых предков.

4. Для этого примера мы зарегистрируем приемник clickListener ( ) непосредственно в объекте-получателе TextField — theTextField, как показано в следующем коде:

theTextFi eld. addEventLi stener(MouseEvent. CLICK, cli ckLi stener);

В результате выполнения описанных шагов наш метод clickListener ( ) будет вызываться всякий раз, когда пользователь щелкает кнопкой мыши на объекте theTextField. В листинге 22.1 представлен код, демонстрирующий предыдущие шаги в контексте простого класса ClickableText.

Листинг 22.1. Обработка события MouseEvent. CLICK

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

public class ClickableText extends Sprite { public function ClickableText ( ) { var theTextField:TextField = new TextField( ); theTextField. text = «Click here»;

theTextField. autoSize = TextFieldAutoSize. LEFT; theTextField. border = true; theTextField. background = true; theTextField. selectable = false; addChild(theTextField);

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

}

private function clickListener (e:MouseEvent):void { traceC’Mouse was clicked»);

}

}

}

Все прошло практически без проблем. Рассмотрим другой пример. Следующий код регистрирует приемник mouseMoveListener ( ), выполняющийся всякий раз при перемещении мыши, когда указатель находится над объектом Sprite, на который ссылается переменная triangle.

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

// Создаем треугольник

var triangle:Sprite = new Sprite( );

tri angle. graphi cs.1i neSty1e(1);

triangle. graphics. beginFi 11 (OxOOFFOO, 1);

tri angle. graphi cs. moveTo(25. 0);

triangle. graphics. lineTo(50. 25);

triangle. graphics. lineTo(0. 25);

triangle. graphics. lineTo(25. 0);

triangle. graphics. endFil1( );

triangle. x = 200;

triangle. у = 100;

// Регистрируем приемник в объекте triangle для событий MouseEvent. M0USE_M0VE tri angle. addEventLi stener(MouseEvent. M0USE_M0VE, mouseMoveLi stener);

// …где-то в классе определяем приемник

private function mouseMoveListener (e:MouseEvent):void {

trace(«mouse move»);

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

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

‘ I Объект не сможет получать уведомления о возникновении событий ввода, пока он не 19 будет добавлен в список отображения.

В листинге 22.2 предыдущий код, создающий треугольник, помещается в контекст основного класса MouseMotionSensor SWF-файла. Здесь объект triangle добавляется в список отображения, поэтому может получать уведомления о возникновении событий мыши.

Листинг 22.2. Обработка события MouseEvent. MOUSE_MOVE над треугольником

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

public class MouseMotionSensor extends Sprite { public function MouseMotionSensor ( ) { // Создаем треугольник var triangle:Sprite = new Sprite( ); tri angle. graphi cs.1ineSty1e(1); tri angl e. graphi cs. begi nFi11(OxOOFFOO. 1); triangle. graphics. moveTo(25. 0); tri angle. graphi cs.1ineTo(50. 25); triangle. graphics. lineToCO. 25); triangle. graphics. lineTo(25. 0); triangle. graphics. endFil1( ); triangle. x = 200; triangle. у = 100;

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

// Регистрируем приемник в объекте triangle для событий // MouseEvent. M0USE_M0VE

tri angle. addEventLi stener(MouseEvent. M0USE_M0VE, mouseMoveLi stener);

}

private function mouseMoveListener (e:MouseEvent):void {

trace(«mouse move»);

Базовый код, описывающий приемник, и код, регистрирующий приемник, представленные в листинге 22.2, могут быть использованы для любого события из табл. 22.1.

Руководство по 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 отображения и списку отображения. Ниже перечислены семь первых шагов в цепочке выполнения, которые помогут вам начать.



Полезные ссылки
Случайные записи
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.47
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 032
  • 12.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.113
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.35
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.32
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 012
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.39
  • 06.03.2011">Руководство по actionscript. часть 4, стр. 132
  • 28.02.2011">Руководство по actionscript. часть 6, стр. 002
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.124
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 076
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.60
  • 21.03.2011">Руководство по actionscript. часть 2, стр. 035
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.163
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 107
Опрос

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

View Results

Loading ... Loading ...