2013-07-31 1 views
0

У меня возникли трудности с последней частью в головоломке AS3-событий.AS3 Event architecture

Я понимаю, что целевые классы наследуются от EventDispatch или реализуют IEventDispatch и могут регистрировать (среди других методов) прослушиватели событий.

Однако чем регистры целевых классов регистрируются? Если событие происходит, как AS3 знает, передать Событие целевым классам?

С уважением, shwell.

ответ

0

Для объектов в списке отображения следующий отрывок из Adobe - это ответ «Когда Adobe® Flash® Player отправляет объект« Событие », этот объект« Событие »совершает путешествие в оба конца от корня списка отображения к целевому узлу, проверяя каждый узел для зарегистрированных слушателей ».

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

0

Прочитайте эту статью о фазах событий, и это будет иметь больше смысла:

http://livedocs.adobe.com/flex/3/html/help.html?content=events_02.html

Надеется, что это помогает. Хорошего дня.

+0

Ну, теперь ** я ** не получаю что-то. Как Flash Player знает, какой объект должен быть объектом события, например, при событии щелчка мыши? Какие точные методы используются для определения фактической цели? То же самое для перемещения, проверяет ли объект на предмет затенения другими объектами или нет? Это можно сделать с помощью фильтрации 'getObjectsUnderPoint()' для самого верхнего 'IEventDispatcher' и обозначить его как цель, но в основном это дикая догадка. – Vesper

+0

Hello Romi. Эта строка из вашей ссылки объясняет, что происходит для экранных объектов, и в основном отвечает на мой вопрос. Но как насчет объектов без отображения? - «Когда Adobe® Flash® Player отправляет объект« Событие », этот объект« Событие »совершает круговое путешествие из корня списка отображения на целевой узел, проверяя каждый узел для зарегистрированных слушателей». Хотя я могу представить аналогичную «поездку туда и обратно» для объектов без отображения. – shwell

0

Вы можете посмотреть, как скворец события работает

starling even dispatcher

Когда DisplayObject пузыри события, он будет проверять, если родитель DisplayObject существует и добавьте родитель bubbleList если существует Util предка displayObject имеет значение null.

Следующий код в скворечнике EventDispatcher

var element:DisplayObject = this as DisplayObject; 
var chain:Vector.<EventDispatcher> = new <EventDispatcher>[element]; 

while ((element = element.parent) != null) 
    chain[int(length++)] = element; 
+0

Если я правильно помню, Starling создала совершенно другую архитектуру/шаблон событий для своей структуры, потому что архитектура Flash, по общему признанию, тяжелая, особенно когда дело касается коллекции мусора. –

0

В AS3 EventDispatcher является реализацией проекта наблюдателя шаблона. Этот класс реализует методы addEventLister, removeEventListener, dispatchEvent' and hasEventListener`. Внутри он также поддерживает словарь или аналогичную структуру данных, которая содержит события, которые в настоящее время прослушиваются, и список методов, которые нужно вызывать при отправке события. Что-то вроде этого -

{"event1": [method7, method5, method3], "event2": [method3, method2], "event3": [method1]}; 

Когда addEventListener вызывается на объект, он создает новый ключ для рассматриваемого события и добавляет ссылки на метод для связанного списка значений.

Когда dispatchEvent вызывается классу, он извлекает все методы, связанные с событием, и вызывает методы, связанные с ним. Каждый метод вызывается с экземпляром класса Event или его подклассов.

Удаление прослушивателя событий, очевидно, делает противоположное тому, что добавляет.

+0

Привет, Пранав, если словарь является внешним по отношению к целям, кажется, что ссылка на цель также должна быть сохранена? Это правильно? – shwell

+0

По заданию я предполагаю, что вы имеете в виду класс, который отправляет событие. В этом случае нет, словарь не является внешним. Класс наследуется от EventDispatcher, поэтому словарь становится внутренним для самого класса. –

+0

Я думаю, что я понял, это событие прошло для всех классов EventDispatch? – shwell

0

Я думаю, вам не хватает addEventListener() механиков. Эта вещь имеет глобальный побочный эффект для механизма событий, регистрируя функцию обратного вызова вместе со значением вызывающего абонента this, чтобы обеспечить правильный контекст инициированного события, с возможным обновлением свойств event.localX и event.localY по телефону globalToLocal() либо статически, либо динамически, так как событие пузырится вверх и вниз.

Если вы, как и я, смущены тем, как Flash-плеер определяет цель события - есть внутренний указатель «фокус», который определяет, какой из компонентов SWF имеет фокус клавиатуры, и тот, который используется для таргетинга события клавиатуры.Для событий мыши наиболее вероятно, что флеш-движок вызывает getObjectsUnderPoint() для запросов к самым верхним объектам IEventDispatcher (не все объекты DisplayObjects могут обрабатывать события), и тот посылает событие мыши, с целью, чтобы целевой показатель был принят MouseEvent.ROLL_OUT или MouseEvent.MOUSE_OUT, если цель была изменена. Для других событий, скорее всего, весь список отображения может реагировать.