События в ActionScript 3. Слушатели и обработчики событий
В предыдущих уроках мини-курса «Основы анимации в ActionScript 3»я уже затрагивал тему событий, которые автоматически генерируются когда что-нибудь происходит в системе или пользователь определенным образом использует клавиатуру или мышь. В AS3 архитектура событий полностью интегрирована во Flash Player.
В этом уроке мы подробно разберем концепцию событий, а также Вы узнаете:
- Что такое слушатель события в ActionScript 3 и какова его роль
- Что такое обработчик события в ActionScript 3 события и для чего он служит
- Какие параметры передаются обработчику события
- Познакомитесь с некоторыми событиями мыши и клавиатуры
Чтобы хорошо разобраться в этой теме, Вам нужно усвоить пару дополнительных концепций:
- слушатели событий
- обработчики событий.
Эти названия говорят сами за себя. Слушатель — это объект, который слушает или ожидает когда произойдет определенное событие. Обработчик — это функция, которая описывает все, что должно случиться после того, как это событие произойдет.
Слушатели событий в ActionScript 3
Как было сказано выше, слушатель — это объект, который слушает или ожидает, когда совершится определенное событие. Вы можете сделать Ваш класс слушателем определенного события, вызвав функцию addEventListener
. Этой функции Вы должны передать в качестве аргументов:
- имя события, которое слушает объект
- имя функции-обработчика этого события
addEventListener("enterFrame", onEnterFrame);
Вы можете использовать дополнительные параметры при добавлении слушателей событий, но в этом курсе «Основы анимации в ActionScript 3» мы не будем их рассматривать. Синтаксис, показанный выше, обеспечит Ваши потребности при работе с событиями в 99% случаев.
Обратите внимание на то, что имя события "enterFrame"
— это строка (как Вам уже хорошо известно, все строки мы заключаем в кавычки). Понятно, что возможны ошибки при записи — забыли поставить кавычки, например. В результате обработчик события не сработает, но и сообщения от компайлера об этой ошибке Вы не получите!
Для того, чтобы избежать подобных ситуаций в AS3 существует другой, равноценный способ записи имен событий. Когда Вы имеете дело с функцией addEventListener
, Вы можете использовать для этого свойства класса Event
. Давайте перепишем код, приведенный выше, следующим образом:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
Если Вы решите узнать, какое же значение присвоено свойству ENTER_FRAME
, то обнаружите, что это "enterFrame"
, являющееся строкой.
Теперь Вы могли бы предположить, что и здесь при записи кода возможны ошибки. Правильно. Но если такое случится, то программа откажется компилировать Ваш код и сообщит об этом. Например, у Вас появится сообщение о том, что такого свойства у класса Event
нет. Кроме того в нем будет указана не только строчка, на которой эта ошибка сделана, но и первый «проблемный» символ на этой строчке. Это очень хорошая система подсказок.
В дополнение к типам событий в классе Event
существуют другие типы событий в других классах, как, например, MouseEvent.MOUSE_DOWN
, KeyboardEvent.KEY_DOWN
, TimerEvent.TIMER
и т.д. Все эти события можно было бы записать с помощью строк: "mouseDown"
, "keyDown"
, "timer"
, но я бы Вам советовал привыкать сразу к записи свойств, а не строк.
Вот еще одна важная для запоминания вещь. Иногда, как например, в предыдущем примере, Вы можете вызывать функцию addEventListener
непосредственно в классе. В этом случае Вы как бы говорите классу, чтобы он слушал свое собственное событие enterFrame
. В других случаях Вам, возможно, понадобиться слушать события сгенерированные другими объектами. Например, у Вас есть кнопка с именем myButton
. Когда пользователь кликает на ней — она генерирует событие mouseDown
. Для того чтобы слушать это событие, Вы должны вызвать метод addEventListener
следующим образом:
myButton.addEventListener(MouseEvent.MOUSE_DOWN, onButtonPress);
Последнее, о чем хотелось бы здесь сказать. Вы можете давать любые имена функциям-обработчикам событий. Например, я назвал свою функцию onEnterFrame
. Это было сделано просто потому, что это имя хорошо описывает событие, а также я привык именно к такой записи. Вы могли бы дать этой функции другое имя, понятное Вам. Например, doCoolThing
.
Разбирая код, написанный другими программистами, Вы заметите, что имена обработчиков событий очень часто записываются с on
в начале. Затем идет описательное имя, говорящее о том, откуда пришло событие, например, onStartButtonClick
или onSpaceshipCrash
.
Как Вы будете записывать имена — это дело Вашего личного вкуса и предпочтений. Главное, будьте в этом постоянны, чтобы с одного взгляда на код было понятно, что обработчик события — это обработчик события.
Идем дальше. Я уже говорил, что слушатель слушает события, но более точным было бы следующее определение: слушателю сообщается о том, что событие произошло.
Объект, генерирующий события, хранит внутри себя список всех объектов, которые добавили себя в него в качестве слушателей. Если объект способен генерировать события различного типа, как, например, mouseDown
, mouseUp
и mouseMove
, то он будет хранить отдельный список слушателей для каждого события. Когда одно из событий происходит, объект проходит по соответствующему списку и сообщает каждому объекту-слушателю о том, что событие случилось.
Еще один способ описания событий — это сказать, что объект, который становится слушателем, подписывается на соответствующее событие. А объект, который генерирует события — транслирует событие всем своим подписчикам.
Если Вы хотите чтобы объект перестал слушать событие, то Вы можете прямо указать ему на это, вызвав метод removeEventListener
:
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
Этот код говорит объекту о том, чтобы он исключил из своего списка слушателей определенный слушатель. Таким образом, он перестанет получать соответствующие уведомления в дальнейшем.
Теперь давайте перейдем к практике и разберем конкретный пример. Код, записанный ниже, создает новый объект (sprite), помещает его на сцену, рисует в нем определенную графику и добавляет к нему слушатель события.
package { import flash.display.Sprite; import flash.events.MouseEvent; public class EventDemo extends Sprite { private var eventSprite:Sprite; public function EventDemo() { init(); } private function init():void { eventSprite = new Sprite(); addChild(eventSprite); eventSprite.graphics.beginFill(0xff0000); eventSprite.graphics.drawCircle(0, 0, 100); eventSprite.graphics.endFill(); eventSprite.x = stage.stageWidth / 2; eventSprite.y = stage.stageHeight / 2; eventSprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); eventSprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onMouseDown(event:MouseEvent):void { trace("кнопка нажата"); } private function onMouseUp(event:MouseEvent):void { trace("кнопка отпущена"); } } }
Что все это значит? Большая часть функции init
просто создает sprite
, рисует в нем круг и размещает его в центре сцены. Для нас наиболее важны последние две строчки.
Здесь класс добавляет себя как слушатель событий MOUSE_DOWN
и MOUSE_UP
. Заметьте, что это свойства класса MouseEvent
, а для того, чтобы все работало корректно, этот класс должен быть импортирован. В качестве обработчиков событий передаются две функции onMouseDown
и onMouseUp
.
Обычно, обработчику события в качестве параметра передается объект события, в котором хранится соответствующая информация о нем (событии). Как минимум, это будет информация об объекте, сгенерировавшем событие.
В случае событий мыши, этой информацией будет:
- местоположение курсора мыши в момент события
- какая кнопка мыши была нажата
- и т.д.
В случае событий клавиатуры, этой информацией будет:
- какая клавиша была нажата в момент события
-
состояние других клавиш, например,
Ctrl
,Alt
иShift
в этот момент
Более подробно о том, какая информация передается, Вы можете узнать из файлов помощи (Help) программы Flash Professional или в Cправочнике по ActionScript 3.0 для платформы Adobe Flash.
Сохраните предыдущий пример как EventDemo.as
и запустите Flash Player. Теперь в панели Output Вы можете наблюдать, как выводятся надписи каждый раз при нажатии и отпускании левой кнопки мыши на красном круге (объект — eventSprite
) .
Обязательно добейтесь того, чтобы этот пример заработал у Вас корректно. Он очень простой, но является хорошим тестом на правильную работу Вашей среды разработки.
Если Вы новичок в ActionScript 3, но у Вас все получилось и Вы действительно поняли, как это работает — примите мои поздравления! Вы только что перешли с начального уровня на средний.
Обработчики событий в ActionScript 3
Итак, Вы уже знаете гораздо больше об обработчиках событий и теперь самое время разобраться со слушателями.
Ранее я сказал, что объект, который генерирует событие его же и транслирует или уведомляет своих слушателей о том, что определенное событие случилось. Как же он это делает?
В действительности, все что он делает — это вызывает функцию с определенным именем. В предыдущем примере класс EvenDemo
добавлил себя как слушатель двух событий, которые генерирует красный круг (eventSprite
). Внутри себя он хранит списки слушателей для каждого события. Это значит, что у него есть один список для события mouseDown
и другой список для события mouseUp
. Эти списки — не что иное как простые массивы. И у каждого списка есть ссылка на главный объект, которым является экземпляр класса EventDemo
.
Когда пользователь нажимает левую кнопку мыши на красном круге (в нашем примере — это eventSprite
), то он реагирует примерно так «Кнопка нажата! Я должен оповестить своих слушателей!» (или что-то в этом роде). Затем он проходит по списку слушателей события mouseDown
и смотрит, кто в нем находится. Затем он находит ссылки на главный объект и функцию, которая определена как обработчик события (в нашем примере — это onMouseDown
). Затем он просто вызывает эту функцию и применяет ее к этому слушателю. Если другие объекты зарегистрировались как слушатели события mouseDown
, то они будут тоже в списке. И соответственно, какие бы обработчики они ни определили — они тоже будут вызваны.
То же самое произойдет и в случае, когда левая кнопка будет отпущена, за исключением того, что теперь проверяться будет список слушателей события mouseUp
.
Итоги
Итак, из этого урока Вы многое узнали о событиях в ActionScript 3, а также слушателях и обработчиках событий. Для того чтобы проверить хорошо ли усвоена информация ответьте на следующие вопросы:
Контрольные вопросы по материалу урока
- Что такое событие?
- Какие типы событий Вы знаете?
- Какой метод вызывается для того, чтобы сделать объект слушателем события?
- Какие параметры передаются этому методу?
- Какие свойства класса MouseEvent Вам известны?
- Какие свойства класса KeyboardEvent Вам известны?
Жду от Вас вопросов, если что-то осталось непонятным. Задавайте их в комментариях.
В следующем уроке мы разберем тему событий в анимации.