Руководство по actionscript. часть 3, стр. 148
Вы вполне можете применять пользовательские события ADDED TO STAGE и REMOVED_FROM_STAGE, даже не имея ни малейшего представления о том, как устроен и функционирует класс StageDetector. Однако он позволяет провести интересный обзор методик программирования, относящихся к списку отображения, которые были рассмотрены в этой главе, поэтому посмотрим, как он работает.
В классе StageDetector объект, для которого отслеживаются пользовательские события ADDED_TO_STAGE и REMOVED_FROM_STAGE, присваивается переменной watchedRoot. Рассмотрим общий подход, применяемый в классе StageDetector для определения присутствия объекта watchedOb j ect в списке отображения.
? Нужно отслеживать события Event. ADDED и Event. REMOVED для объекта watchedRoot.
? Когда объект watchedRoot добавляется в объект DisplayOb j ectContainer, проверять, находится ли watchedOb j ect в настоящий момент в списке отображения (он находится в списке отображения, если значение его переменной stage не равно null). Если в настоящий момент объект watchedOb j ect находится в списке отображения, то следует выполнить диспетчеризацию события StageDetector. ADDED_TO_STAGE. Если нет, то приступить к отслеживанию событий Event. ADDED и Event. REMOVED для нового объекта watchedRoot. t
? Когда объект watchedOb j ect есть в списке отображения, если watchedRoot или любой из его потомков удаляется из объекта DisplayOb j ectContainer, проверять, является ли удаленный объект предком watchedOb j ect. Если да, то выполнить диспетчеризацию события StageDetector. REMOVED_FROM_STAGE и приступить к отслеживанию событий Event. ADDED и Event. REMOVED для нового корня иерархии отображения объекта watchedOb j ect.
Теперь рассмотрим код класса StageDetector.
Листинг 20.8. Пользовательские события ADDED_TO_STAGE и REMOVED_FROM_STAGE
package { import flash. display.*: import flash. events.*:
// Наблюдает за указанным отображаемым объектом, чтобы определить,
// когда этот объект добавляется или удаляется из экземпляра класса Stage,
// и рассылает соответствующие пользовательские события
// StageDetector. ADDED_TO_STAGE и StageDetector. REMOVED_FROM_STAGE.
// ИСПОЛЬЗОВАНИЕ:
// var StageDetector:StageDetector = new StageDetector(someDisplayObject); // StageDetector. addEventListener(StageDetector. ADDED_TO_STAGE, // addedToStageListenerFunction);
// stageDetector. addEventLi stener(StageDetector. REMOVED_FROM_STAGE, // removedFromStageListenerFunction);
public class StageDetector extends EventDispatcher { // Событийные константы
public static const ADDED_TO_STAGE:String = «ADDED_TO_STAGEH: public static const REMOVED_FROM_STAGE:String = «REMOVED_FROM_STAGE»;
// Объект, для которого будут генерироваться события ADDЕD_TO_STAGЕ // и REMOVED_FROM_STAGE
private var watchedObject:DisplayObject = null:
// Корень иерархии отображения, содержащей объект watchedObject private var watchedRotit.’D'is’f&layObject = null:
// Флаг, который говорит, находится ли объект watchedObject // в настоящий момент в списке отображения private var onstage:Boolean = false:
// Конструктор
public function StageDetector (objectToWatch:DisplayObject) {
// Приступаем к мониторингу указанного объекта
setWatchedObject(obj ectToWatch); } ‘
// Приступает к мониторингу указанного объекта, чтобы определить,
// добавлен объект в список отображения или удален из него
public function setWatchedObject (objectToWatch:DisplayObject):void {
// Сохраняем отслеживаемый объект
watchedObject = objectToWatch:
// Помечает, находится ли объект watchedObject в настоящий момент // в списке отображения if (watchedObject. stage!= null) { onstage = true:
}
// Находит корень иерархии отображения, содержащей объект
// watchedObject, и регистрируем в найденном объекте приемники
// для событий ADDED/REMOVED. Проверяя, добавлен или удален
// корень объекта watchedObject, мы сможем определить,
// находится объект watchedObject в списке отображения или нет.