Ядром модели событий Генератор – Листенеры Flash MX 2004

Ядром модели событий Генератор – Листенеры Flash MX 2004 является недокументированный объект AsBroadcaster. Его методы позволяют регистрировать объект как генератор событий, рассылать сообщения листенерам, добавлять и удалять листенеры.

Данный объект может быть полезен, если вы хотите создать собственное событие или сделать объект одного класса листенером событий другого. Ввиду таких обширных возможностей AsBroadcaster является самой популярной и востребованной недокументированной возможностью ActionScript после функции ASSetProp-Flags(). Поэтому обойти его вниманием только из-за того, что разработчики отказались включить его в официальный справочник, было бы совсем неправильно.

Объект AsBroadcaster() имеет 4 метода, отвечающих за функционирование всей модели событий:

• AsBroadcaster.initialize(obj), где obj — идентификатор объекта. Данный метод позволяет регистрировать объект как генератор событий. При этом на инициализируемый объект переносятся хранимые AsBroadcaster методы, отвечающие за добавление и удаление листенеров (уже знакомые нам addListener() и removeListener()), а также метод, управляющий рассылкой сообщений листенерам (broadcastMessage()).


Кроме того, создается свойство Listeners, хранящее пустой массив.

Чтобы убедиться, что метод AsBroadcaster.initialize() работает именно так, как описано выше, мы попробуем зарегистрировать в качестве источника событий пользовательский объект:

var obj:Object = {}; // Создаем объект
// Проверяем, какие свойства имеются у объекта до его инициализации
// как генератора событий
ASSetPropFlags(obj, null, null, 1); // Делаем скрытые свойства доступными
// для перечисления
for (var i in obj) {
trace(i); // Выводит: __proto__ (свойство хранит указатель
// на прототип конструктора) constructor
// (указатель на конструктор класса)
// Проверяем, какие свойства появились после использования метода
// AsBroadcaster.initialize()
AsBroadcaster.initialize(obj);
ASSetPropFlags(obj, null, null, 1);
for (var i in obj) {
trace(i); // Выводит: _listeners removeListener addListener
// broadcastMessage __proto__ constructor
}

• AsBroadcaster.addListener(listener). Метод, присваиваемый генераторам событий при инициализации и отвечающий за добавление листенера в массив _listeners.


Его мы подробно обсуждали ранее.

• AsBroadcaster.removeListcner(listener). Присваиваемый объектам, генерирующим события, метод, служащий для удаления листенера из массива _listeners.

• AsBroadcaster.broadcastMessage("Event", parameters), где "Event" — строка с именем события, parameters — список передаваемых обработчику событий параметров. Данный метод, присваиваемый объекту при его регистрации в качестве генератора событий, служит для отправления всем листенерам сообщения о событии. На уровне реализации модели событий при вызове данного метода происходит следующее: перебираются все элементы массива _listeners и для каждого из них осуществляется вызов метода с именем" Event". Hапример, если пользователь выполняет щелчок мышью, то проделывается следующая строка кода:

Mouse["broadcastMessage"]("onMouseDown");

Действия, которые будут при этом выполнены, могут быть продублированы следующими строчками сценария:

for (var i = 0; i Mouse["_listeners"][i]["onMouseDown"]();
}

При необходимости обработчику события могут быть переданы параметры. Для этого их список должен быть прописан в качестве аргументов метода broadcastMessage().


К сожалению, из встроенных событий лишь немногие сопровождаются передачей параметров. Например, такими событиями являются onSetFocus и onKillFocus (они присущи кнопкам, клипам и текстовым полям), То, что обработчикам событий редко передаются аргументы, не всегда оправданно. Так, например, при обработке нажатия клавиши (событие onKeyDown объекта Key) практически всегда нужно знать ее код. Обычно для этого используется метод Key.getCode(), Однако при желании можно создать собственный отвечающий за события клавиатуры объект таким образом, чтобы при нажатии клавиши его листенеры получали ее код:

_global.myKey = {}; // Пользовательский аналог Key
AsBroadcaster.initialize(myKey); // Регистрируем myKey как генератор
// событий
Key.addListener(myKey); // Заносим myKey в список листенеров объекта Key
// При нажатии клавиши myKey отправляет вызовы метода onKeyDown своим
// листенерам с кодом задействованной кнопки в качестве параметра
myKey.onKeyDown = function():Void {
var kod:Number = Key.getCode();
myKey.broadcastMessage("onKeyDown", kod);
};
myКеу.addListener(_root); // Регистрируем _root как листенер myKey
_root.onKeyDown = function(kod:Number):Void {
trace(kod); // При нажатии кнопок клавиатуры в Output
// появляются их коды
};

Используя возможности, предоставляемые объектом AsBroadcaster., можно справиться с задачей, которая оказалась нам не по силам в начале этой главы — «подписать» кнопку на событие клипа.

Для примера сделаем кнопку листенером события onEnterFrame:

// Создаем кнопку и называем ее but
// Создаем пустой клип — он Судет генерировать событие
this.createEmptyMovieClip("eventClip", 100000);
// Инициализируем клип как источник событий
AsBroadcaster.initialize(eventClip);
// При загрузке нового кадра отправляем сообщение о событии onEnterFrame
// всем листенерам
eventClip.onEnterFrame = function():Void {
this.broadcastMessage("onEnterFrame");
};
// Добавляем кнопку but в массив листенеров клипа eventClip
eventClip.addListener(but);
but.onEnterFrame = function():Void {
this._xscale = this._yseale += 1; // Кнопка плавно увеличивается
};

Главное достоинство объекта AsBroadcaster заключается в том, что с его помощью вы можете создавать собственные события. Попробуйте для тренировки самостоятельно написать код, генерирующий событие двойного щелчка мышью.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Модель событий Flash 5
Модель событий Генератор—Листенеры
Обновление экрана при событиях
Событийные методы

Вернуться в раздел: Action Script / 8. События