Руководство по actionscript. часть 4, стр. 127
В листинге 23.4 продемонстрирован измененный класс Ellipse (изменения, как и раньше, выделены полужирным шрифтом). Обратите внимание, что метод
addedToStageListener ( ) вызывает метод stage. invalidate ( ), гарантируя, что любые изменения, внесенные в объект Ellipse за то время, пока он не находился в списке отображения, будут визуализированы при добавлении этого объекта в список отображения.
*»4
В листинге 23.4 применяются пользовательские события StageDetector. ADDED_TO_STAGE и StageDetector. REMOVED_FROM_STAGE, диспетчеризация которых осуществляется поль-3?-’ зовательским классом StageDetector. Детальное рассмотрение данного класса можно найти в подразд. «События ADDED_TO_STAGE и REMOVED_FROM_STAGE» разд. «События контейнеров» гл. 20.
Листинг 23.4. Измененный класс Ellipse, часть 2
package { import flash. display. Shape; import flash. events.*;
public class Ellipselnterim extends Shape { private var w:Number; private var h:Number;
public function Ellipselnterim (width:Number, height:Number) { // Регистрируем приемники для получения уведомлений, // когда данный объект добавляется в список // отображения или удаляется из него var StageDetector-.StageDetector = new StageDetector (this); StageDetector. addEventLi stener(StageDetector. ADDEDJTJSTAGE,
addedToStageListener); StageDetector. addEventLi stener (StageDetector. REMOVEDFROMSTAGE,
removedFromStageListener);
w = width; h = height; if (stage!= null) { stage. invalidate( );
}
}
public function setWidth (newWidth:Number):void { w = newWidth; if (stage!= null) { stage. invalidate( );
}
}
public function getWidth ( ):Number { return w;
}
public function setHeight (newHeight:Number):void { h = newHeight;
if (stage!= null) { stage. invalidate( );
}
}
public function getHeight ( ):Number { return h;
}
// Приемник события вызывается при добавлении этой фигуры // в список отображения
private function addedToStageListener (e:Event):void { // Регистрируем приемник для получения уведомлений // об обновлениях экрана
stage. addEventListener(Event. RENDER, renderListener);
// Гарантируем, что любые изменения, внесенные в данный объект // за то время, пока он не отображался на экране, будут // визуализированы при его добавлении в список отображения, stage. invalidate( );
}
// Приемник события вызывается при удалении этой фигуры из списка // отображения
private function removedFromStageLi stener (e: Event) .-void { // Нет необходимости в получении событий // обновления экрана, когда данный объект // не находится в списке отображения stage. addEventListener(Event. RENDER, renderListener);
}
private function renderListener (e:Event):void { draw( );
}
private function draw ( ):void { graphics. clear( ); graphics. lineStyle(l); graphics. beginFill(OxFFFFFF, 1); graphics. drawEllipse(0. 0. w, h);
}
}
}
Класс Ellipse, представленный в листинге 23.4, теперь является полностью функциональным, однако в нем все еще остаются две существенные избыточности. Во-первых, метод addedToStageListener ( ) всегда вызывает метод stage. invalidate ( ), когда объект Ellipse добавляется в список отображения. В результате перерисовка фигуры происходит даже в тех случаях, когда в этом нет необходимости, поскольку за то время, пока эллипс не отображался на экране, данные концептуального эллипса не изменялись.