I am a little confused about the setActualSize method. It appears from what I’ve read, that if it is not called on a component by its parent, the component will not be rendered.
So it appears that setActualSize is a critical method that is directly bound to rendering the UIComponent. It also appears that the width and height properties of UIComponent override the functionality of the width and height properties of flash.display.DisplayObject, in that they are not directly bound to the rendering of the object but are virtual values that are mainly used by the getExplicitOrMeasured when the parent of the component calls the component’s setActualSize method.
So the question are:
1) Why isn’t the default behavior of every component to just call setActualSize(getExplicitOrMeasuredWidth(),getExplicitOrMeasuredHeight()) on itself?
2) I guess this question stems from the above question and the behavior as I understand it as described above: does setActualSize change the visibility of the component?
It appears that that the behavior is that a component is not rendered until setActualSize is called, but if it contains display object children itself (expected behavior as it can calculate measure on itself) and is added to the display list, the only reason why flash isn’t rendering it, is because its not visible.
The answers to your questions are in the way the Flex component life cycle works, consider these two phases:
measurement:
The Flex framework will call the
measure()method of your component. You can override this method to set a default and/or minimum size for your component.Flex components first measure themselves to provide a default and/or minimum size suggestion to the layout/container classes. Flex does this from a bottom up approach, so that the lowest level objects are measured first. Thus when each parent object measures itself, the preferred sizes of it’s child objects has been established.
rendering:
Later Flex calls the
updateDisplayList()method of your component. You can override this to size/position your component’s child objects. This is wheresetActualSize()is intended to be used: the parent callssetActualSize()on it’s child objects, not on itself.Note the method signature of updateDisplayList():
Measurement was done from the bottom up. However, rendering is done from the top down. So at render time, updateDisplayList(unscaledWidth, unscaledHeight) gets executed on your component. Flex is telling your component the space it has been allotted to render itself, and your component must size/position it’s child objects accordingly and/or do programtic drawing.
The sizes passed in to updateDisplayList() are based on various factors:
your component has a fixed width/height)
parameters (fixed, percent, constraint) and layouts that you use
An old but good resource on this topic