老调长谈的Flex 4.6 可视组件的生命周期
本文参考Adobe flex 4.6 help,写作目的仅为了个人加强记忆与体会
Flex 4以上版本中,可视组件分为spark和halo两套,spark用组件类和皮肤类的分离大大提高了对自定义外观的支持,特别是对于某些子皮肤部件移动位置改变布局的自定义外观,再也不需要大费周章的重写组件的updateDisplay方法了。
两套组件在生命周期上其实差别不大
spark组件var btn:Button=new Button();btn.label="按钮";var box:VGroup=new VGroup();box.addElement(btn);
Halo组件var btn:Button=new Button();btn.label="按钮";var box:VBox=new VBox();box.addChild(btn);
1、调用构造函数
var btn:Button=new Button();
2、设置组件属性
btn.label="按钮";
设置属性可能会调用组件的相关失效方法如
invalidateProperties,invalidateSize,
invalidateSkinState(仅spark SkinnableComponent组件),invalidateDisplayList;
需要注意的是,如果此时可视组件并未添加到舞台,则组件的nestLevlel为0,即使调用了以上失效方法,LayoutManager也不会把组件添加到验证序列,也就是说,相关的验证方法(commitProperties、measure、updateDisplayList)也并不会在下一个渲染事件时执行。而是会等到该可视组件添加到舞台之后,重新设置UIComponent的nestLevel时,再调用updateCallbacks方法,才会调用LayoutManager的失效方法把该可视组件添加到验证序列中,等到下一个render事件(或是ENTER_FRAME事件)中调用组件的相关验证方法
3、把可视组件添加到舞台
spark组件使用addElement,Halo组件使用addChild。
4、设置组件的parent属性
5、计算组件的style设置
6、组件调度preinitialize事件
7、组件调用createChildren方法
Halo组件在createChildren方法中创建子组件,并侦听子组件的相关事件。
而spark SkinnableComponent组件在createChildren方法中调用validateSkinChange→再调用attachSkin方法,在attachSkin方法中创建skin,添加到组件类显示列表上,然后调用findSkinParts方法,循环skin实例中的皮肤部件,把每个皮肤部件的id和皮肤部件实例对象本身作为参数调用partAdded方法,组件开发者一般在partAdded方法中给皮肤部件添加事件侦听。findSkinParts完成后,会调用invalidateSkinState方法(该方法仅检测skinStateIsDirty布尔标志变量是否为true,不为true则设为true,调用invalidateProperties方法)
8、调用失效方法
invalidateProperties,invalidateSize,
invalidateSkinState(仅spark SkinnableComponent组件),invalidateDisplayList;
9、组件调度initialize事件,此时子组件已创建完毕,但尚未布局、设置尺寸。
10、父容器组件调度elementAdd(spark)或childAdd(Halo)事件
11、父容器组件调度initialize事件
12、在SystemManager(Flex程序的真正主类)的下一个render事件调度时,组件调用相关的验证方法如
commitProperties,measure(如果设置了显示尺寸值,则不会调用),updateDisplayList。
spark SkinnableComponent组件的commitProperties方法会检测skinStateIsDirty布尔标志变量,如果为true,则会调用getCurrentSkinState方法获取skin应有的可视状态State,然后将其设为skin的currentState属性
13、如果在验证方法调用的过程中,再次调用了失效方法,则会在SystemManager的再下一个render事件中,再次调用组件的验证方法
14、最后一个render事件中,组件的验证方法(没有再次调用失效方法)执行完毕后,设置组件visible为true,调度creationComplete事件(仅在组件创建完成时调度一次)
15、调度updateComplete事件。可视组件每次因为布局、位置、尺寸等变化而更新组件显示完成后,都会调度updateComplete事件