События показывают, когда что-нибудь случается. Щелчок по кнопке
обозначает событие "click". При загрузке во флеш-плеер внешнего
текстового файла возникает событие "complete", обозначающее, что
содержимое этого текстового файла было полностью загружено в плеер.
Фактически, действия ActionScript полностью основаны на событиях.
Используете ли вы обработчик событий для запуска кода по нажатию
кнопки, либо записываете команды в кадрах временной шкалы (запускаются
во время события флеш-плеера, которое показывает этот кадр), в любом
случае вы пишите код, который реагирует на события.
События в прошлом
Для
действий, не основанных на кадрах, большинство событий (в частности,
события мыши и клавиатуры) изначально обрабатывались внутри блоков кода
on([event]){}, помещенных в символы кнопок.
// Starting with Flash 2 and available for // ActionScript 1 and 2, a press event // placed on a selected button symbol on(press) { // play timeline in which this button exists play(); }
События, использовавшиеся с on (некоторые появились после Flash 2), включали:
press release releaseOutside rollout rollover dragOut dragOver keyPress ["whichKey"]
После
появления Flash 5 в ActionScript появился новый вид обработчика
событий, который мог добавляться не в символы кнопок, а в клипы. Это
делалось с использованием блока кода onClipEvent([event]){}.
// Flash 5; ActionScript 1 // Placed on a selected movie clip symbol onClipEvent(enterFrame) { // move this movie clip 5 frames to // the right every time the Flash player // draws a frame based on the frame rate _x += 5; }
Во
Flash 5 также появилась возможность загружать во флеш-плеер XML файл с
новым (в то время) XML объектом. Чтобы программисту было известно,
когда XML был загружен и проанализирован, XML объекту назначался
обработчик события onLoad. Этот обработчик был в
форме определения динамической функции, которое в любое время могло
быть определено, удалено или изменено для XML объекта.
// Flash 5; ActionScript 1 // XML onLoad handler var myXML = new XML();
// event handler called when // XML has been loaded into myXML myXML.onLoad = function(success){ // if XML has been loaded and parsed // successfully, success is true if (success){ trace(this); // trace XML } }
// load the XML into the XML object when // loaded and parsed, onLoad will be called myXML.load("xmlFile.xml");
Flash
MX (6) значительно улучшил обработку событий. Было разрешено
использование блоков кода не только на кнопках и клипах вместе взятых
(в противоположность только кнопкам) но Flash MX также позволил
создавать динамические обработчики событий для кнопок и клипов тем же
способом, как определялся обработчик события onLoad для XML объектов во Flash 5. Несмотря на то, что обработчики on и onClipEvent были
статическими и не могли изменяться во время прогона, использование этих
основанных на функциях обработчиков означало, что событие могло быть
удалено или переопределено в процессе проигрывания флеш фильма, что
было особенно полезно для событий onEnterFrame, используемых для обработки анимации.
// Flash MX; ActionScript 1 // onEnterFrame event handler // assigned for for a movie clip instance myBall_mc.onEnterFrame = function(){ // move this movie clip to the right // by 5 pixels every frame this._x += 5;
// if the x position of this movie clip // is greater than 200, delete the event handler if (this._x > 200){ delete this.onEnterFrame; } }
Более важным является то, что Flash MX представил новое понятие для
ActionScript, называемое листенером. Листенеры – это объекты с методами
(и позднее могли включать только методы или функции), которые прислушиваются
к событиям и имеют обработчик, вызываемый в качестве результата
события. Ключевая идея в поддержку листенеров заключается в том, что к
любому событию можно привязать более одного обработчика. С обычными
обработчиками событий, такими как обработчик события onLoad для XML объекта, можно определить только одну функцию onLoad.
Если вы определите ее снова, то прежняя функция onLoad будет переписана
и вытеснена новым определением. Было очень трудно иметь более одного
обработчика, привязанного к одному событию. Листенеры разрешили эту
проблему.
С листенерами, вместо того, чтобы назначить обработчик
события для объекта, получающего это событие, нужно было привязать
обработчик события к другому объекту – любому другому объекту – а затем
этот объект добавлялся в качестве листенера объекта, изначально
получающего событие. // Flash MX; ActionScript 1 // Mouse listeners; more than one // object/handler reacting to the same event var handler1 = new Object(); handler1.onMouseDown = function(){ trace("Handler 1"); }
var handler2 = new Object(); handler2.onMouseDown = function(){ trace("Handler 2"); }
Mouse.addListener(handler1); Mouse.addListener(handler2);
// Clicking the mouse once results in the traces: // Handler 1 // Handler 2
Так как и handler1, и handler2 в примере выше были листенерами объекта Mouse, их методы onMouseDown вызывались в качестве обработчиков события onMouseDown объекта Mouse. Если вы захотели, чтобы объект перестал быть листенером события, нужно использовать removeListener().
Привязка листенеров к методу addListener была отличной идеей, но ограничивалась несколькими объектами. Они включали:
Key Mouse Selection Stage TextField FStyleFormat
С
Flash MX 2004 (7) появился ActionScript 2. С ним пришел новый набор
компонентов, которые использовали архитектуру, известную как V2
("Версия 2"). Эта архитектура использовала новый вид формата листенера,
который был похож на использование метода addListener,
но вместо добавления объекта в качестве листенеров других объектов, он
прислушивался к особым событиям от других объектов. Здесь использовался
новый метод, называемый addEventListener, который был частью нового (V2) класса, называемого EventDispatcher. Метод addEventListener
принимал как объект с обработчиками событий (или только функцию
обработчика события), так и имя ожидаемого события. Добавление события
предотвратило посылку ненужных событий объектам, не имеющим для них
обработчиков событий (например, handler1 и handler2
в предыдущем примере получили события onMouseDown и onMouseUp от
объекта Mouse, даже, несмотря на то, что у них не было обработчиков для
них). Кроме того, событийный объект доходил до обработчиков событий,
добавленных в качестве листенеров, при вызове события, предназначенного
для предоставления информации о происходящем событии.
// Flash MX 2004; ActionScript 2 // button component event handlers
// Listener object with event handler var handlerObject:Object = new Object(); handlerObject.click = function(event:Object):Void { trace(event.type +": "+ this); }
// Listener function function handlerFunction(event:Object):Void { trace(event.type +": "+ this); }
// assign to be listeners of // submit_button for the click event submit_button.addEventListener("click", handlerObject); submit_button.addEventListener("click", handlerFunction);
// Clicking the submit_button component: // click: _level0.submit_button // click: [object Object]
Поскольку
эта форма обработки событий была встроена в архитектуру V2 компонента
(класс EventDispatcher является частью этой архитектуры), на самом деле
ее нельзя было увидеть где-нибудь еще в ActionScript за пределами
компонентов. Основные языковые объекты, такие как Mouse и Key,
по-прежнему использовали более старый метод addListener для обработки
событий. Все это изменилось с приходом ActionScript 3.
|