Метод updateDisplayList()
- это место, где вы должны определять размер и расположение дочерних объектов вашего компонента. Вы не должны устанавливать размер самого компонента (то есть: не делать: this.width=100
).
Вы также можете выполнять программирование в updateDisplayList()
, используя флэш-графику apis.
updateDisplayList()
вызывается Flex, и два параметра unscaledWidth
и unscaledHeight
- это размер, при котором будет отображаться ваш компонент. Вы должны соблюдать эти размеры и устанавливать размер дочерних объектов вашего компонента на их основе.
При установке размера в updateDisplayList()
вы не изменяете свойства ширины / высоты напрямую. Это приведет к запуску большего количества методов жизненного цикла Flex. Вместо этого используйте метод setActualSize()
дочернего компонента.
То же самое относится и к настройке свойств x / y вашего дочернего объекта. Не устанавливайте их напрямую, используйте метод move()
.
Наконец, во Flex 4 добавлены некоторые аналогичные методы жизненного цикла для компонентов Spark. Используйте их, где это возможно: setLayoutBoundsSize()
, setLayoutBoundsPosition()
.
Вот ваш исходный updateDisplayList()
, измененный в соответствии с приведенным выше:
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
trace(unscaledWidth, unscaledHeight);
// like Janroel said above, you should call the super class method
// the only time you don't need to is when your component extends UIComponent
// (because UIComponent's updateDisplayList doesn't do anything)
super.updateDisplayList(unscaledWidth, unscaledHeight);
// don't do this (your component will get sized by its parent)
//this.width = unscaledWidth;
// if 'rect' inherits from UIComponent you should use the setActualSize() method:
rect.setActualSize(unscaledWidth, unscaledHeight);
// if it doesn't inherit from UIComponent, do it the regular way...
rect.width =unscaledWidth;
//this.height = unscaledHeight;
rect.height = unscaledHeight;
}