ActionScript 3 полностью обновил способ, которым
обрабатывались события в ActionScript. Существуют две главные темы,
определяющие события ActionScript 3: 1. Последовательная обработка событий с новым собственным классом EventDispatcher. 2. Поддержка передачи событий внутри объектов отображения.
Хотя класс EventDispatcher не является абсолютно новым, так как
существовал в архитектуре V2 компонента, представленной в компонентах
Flash MX 2004, в ActionScript 3 EventDispatcher был обновлен и сделан
неотъемлемой частью языка ActionScript, ответственной, по существу, за
всю обработку событий. Как это понимать применительно к событиям в
ActionScript 3?
отсутствует on(event){} отсутствует onClipEvent(event){} отсутствует добавление скриптов в выбранные объекты. Период. отсутствует object.onEvent = function(){} (для собственных событий) отсутствует addListener отсутствуют листенеры, основанные на объекте (теперь только с использованием методов/функций)
В ActionScript 3 все обработчики событий связываются с событиями посредством addEventListener и
состоят из единственной функции листенера. С событиями в ActionScript 3
вы получаете гибкость листенеров (более одного обработчика для любого
одного события) и эффективность 2-й версии метода addEventListener
(может выделять события), плюс увеличение в производительности как
результат класса EventDispatcher, являющегося теперь собственным
классом флеш-плеера.
Также, в ActionScript 2, при вызове
обработчика события, он получал аргумент Object (типа Object),
содержащий некоторую информацию о событии, такую как тип события и
любые свойства, которые могут быть специфическими для этого события.
ActionScript 3 формализовал этот процесс, имеющий сейчас
предопределенные классы Event, предназначенные для использования внутри
событий вместо общих объектов, использовавшихся с ActionScript 2. Эти
событийные объекты содержат тип события, место порождения события,
текущий объект, получающий событие, а также несколько других свойств,
используемых для описания произошедшего события.
Разные виды
событий имеют разные виды классов Event. Самым базовым является класс
Event, но существуют также и другие классы Event, такие как MouseEvent,
KeyboardEvent, и многие другие. Эти классы зачастую также содержат типы
событий в качестве неизменных свойств класса. Событие click, например,
имеет тип события "click", который определяется в классе MouseEvent в
качестве MouseEvent.CLICK. Цель использования этих
значений вместо их строковых представлений заключается в том, чтобы
компилятор ActionScript имел возможность предупредить вас об
орфографических ошибках, если вы их совершите.
button.addEventListener("clikc", handler); // no error button.addEventListener(MouseEvent.CLIKC, handler); // Error!
Вкратце, обработка событий в ActionScript 3 означает:
использование методов addEventListener/removeEventListener ожидание типов событий, хранящихся в классах Event использование функции (не объекта) обработчика/листенера определение обработчика/листенеров для получения аргумента типа Event
// ActionScript 3 event handler function clickSubmit(event:MouseEvent):void { gotoAndStop("submitFrame"); }
// add clickSubmit event handler as listener of the // click event received by submit_button instance submit_button.addEventListener(MouseEvent.CLICK, clickSubmit);
Наряду
с тем, как определяются обработчики событий, вы также найдете изменения
в том, как они работают и распознаются. Изменилось много имен событий,
в то время как другие события были добавлены, а некоторые даже удалены.
Здесь приведено короткое сравнение некоторых общих событий между
ActionScript 2 и ActionScript 3.
Общие интерактивные события | | ActionScript 2 | ActionScript 3 | Различия | | onPress | "mouseDown" (MouseEvent.MOUSE_DOWN) | | | onRelease | "mouseUp" (MouseEvent.MOUSE_UP), "click" (MouseEvent.CLICK) | Событие
click очень похоже на событие onRelease, так как оно зависит от
объекта, вначале получающего событие mouseDown, тогда как mouseUp может
произойти независимо от того, что было нажато | | onReleaseOutside | "mouseUp" (MouseEvent.MOUSE_UP) | Это
событие было удалено, но использование события mouseUp на сцене
(благодаря передаче) позволит вам определить, когда кнопка мыши была
отпущена за пределами изначально нажатого объекта | onRollOver
| "mouseOver" (MouseEvent.MOUSE_OVER), "rollOver" (MouseEvent.ROLL_OVER) | Теперь для перемещения курсора над объектами могут использоваться два события; mouseOver будет передаваться, rollOver не будет | | onRollOut | "mouseOut" (MouseEvent.MOUSE_OUT), "rollOut" (MouseEvent.ROLL_OUT) | Теперь для удаления курсора с объекта могут использоваться два события; mouseOut будет передаваться, rollOut не будет | | onDragOver | "mouseOver" (MouseEvent.MOUSE_OVER), "rollOver" (MouseEvent.ROLL_OVER) | Выявление "drag" придется осуществлять вручную в сочетании с событием mouseDown | | onDragOut | "mouseOut" (MouseEvent.MOUSE_OUT), "rollOut" (MouseEvent.ROLL_OUT) | Выявление "drag" придется осуществлять вручную в сочетании с событием mouseDown | | mouseDown | "mouseDown" (MouseEvent.MOUSE_DOWN) | Теперь
работает только, когда мышь находится над объектом, посылающим событие
(как onPress); обычные объекты не могут быть сделаны листенерами
объекта Mouse, чтобы он мог получить это событие, могут только
экземпляры InteractiveObject | | mouseUp | "mouseUp" (MouseEvent.MOUSE_UP) | Теперь
работает только, когда мышь находится над объектом, посылающим событие
(как onRelease, но не требует, чтобы объект был сначала нажат); обычные
объекты не могут быть сделаны листенерами объекта Mouse, чтобы он мог
получить это событие, могут только экземпляры InteractiveObject | | mouseMove | "mouseMove" (MouseEvent.MOUSE_MOVE) | Теперь
работает только, когда мышь находится над объектом, посылающим событие;
обычные объекты не могут быть сделаны листенерами объекта Mouse, чтобы
он мог получить это событие, могут только экземпляры InteractiveObject | | onKeyDown | "keyDown" (KeyboardEvent.KEY_DOWN) | Объект
должен быть в фокусе, чтобы получить это событие; обычные объекты не
могут быть сделаны листенерами объекта Key, чтобы он мог получить
событие, могут только экземпляры InteractiveObject | | onKeyUp | "keyUp" (KeyboardEvent.KEY_UP) | Объект
должен быть в фокусе, чтобы получить это событие; обычные объекты не
могут быть сделаны листенерами объекта Key, чтобы он мог получить
событие, могут только экземпляры InteractiveObject |
Вы
можете заметить тему уменьшения числа событий, необходимых для работы с
ActionScript. Более ранние события onPress и onMouseDown теперь были
объединены в одно событие mouseDown в ActionScript 3. Точно также, вы
видите события, которые менее глобальны и более специфичны для
родственного объекта. Событие mouseMove, например, теперь работает
только, когда курсор мыши находится над объектом, обрабатывающим
событие. Похожим образом события key реагируют только на объекты,
имеющие в данный момент фокус.
Другие типы поведения относительно событий мыши и объектов отображения
также изменились. В ActionScript 2, например, добавляющем любой
обработчик onPress, onRelease или похожий обработчик
события мыши "on" клипу, приводило к появлению курсора в виде руки (или
пальца), когда мышь находилась над этим клипом. Это больше не действует
в ActionScript 3. Этот курсор в виде руки не будет виден до тех пор,
пока свойство buttonMode и useHandCursor объекта отображения не приобретут значение true (useHandCursor имеет значение true по умолчанию, но buttonMode не имеет). Устанавливая buttonMode
в значение true, сфокусированный объект активируется на получение
события click, если на клавиатуре нажата клавиша пробел или Enter.
// Show the hand cursor for myButton // and allow clicking through Spacebar and Enter myButton.buttonMode = true;
Точно
так же, при определении тех же обработчиков события в ActionScript 2,
которые предоставляли курсор в виде руки, вы также сообщали флеш
плееру, что клип был активирован для получения событий мыши, или, что
для этого экземпляра необходимо перехватить и обработать события мыши.
Клипы без тех "on" обработчиков событий мыши игнорировали события мыши
и позволяли проходить им к любым экземплярам клипов под ними с
включенной обработкой событий мыши. В ActionScript 3 все объекты
отображения, способные обрабатывать события мыши (любой экземпляр на
экране, являющийся наследником класса InteractiveObject, включая
Sprites и MovieClips) будут иметь способность обрабатывать эти события
по умолчанию. Они не дают событиям возможности дойти до экземпляров,
расположенных под ними, даже если они не имеют определенных для них
обработчиков событий. Чтобы изменить это, следует установить свойство mouseEnabled объекта в значение false.
// Allow objects beneath the overlay // instance to receive mouse events overlay.mouseEnabled = false;
Существует похожее свойство mouseChildren, относящееся к объектам-потомкам внутри экземпляра контейнера объекта отображения. Когда свойство mouseChildren
установлено в false, объекты-потомки не будут получать события мыши, но
главный объект-родитель будет их получать (предполагая, что mouseEnabled установлено в true). Это пригодится при работе с передачей событий.
// Prevent the child objects in the // window instance from receiving mouse events window.mouseChildren = false;
|