本文參考Adobe flex 4.6 help,寫作目的僅為了個人加強(qiáng)記憶與體會
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的曲陽網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
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、調(diào)用構(gòu)造函數(shù)
var btn:Button=new Button();
2、設(shè)置組件屬性
btn.label="按鈕";
設(shè)置屬性可能會調(diào)用組件的相關(guān)失效方法如
invalidateProperties,invalidateSize,
invalidateSkinState(僅spark SkinnableComponent組件),invalidateDisplayList;
需要注意的是,如果此時可視組件并未添加到舞臺,則組件的nestLevlel為0,即使調(diào)用了以上失效方法,LayoutManager也不會把組件添加到驗證序列,也就是說,相關(guān)的驗證方法(commitProperties、measure、updateDisplayList)也并不會在下一個渲染事件時執(zhí)行。而是會等到該可視組件添加到舞臺之后,重新設(shè)置UIComponent的nestLevel時,再調(diào)用updateCallbacks方法,才會調(diào)用LayoutManager的失效方法把該可視組件添加到驗證序列中,等到下一個render事件(或是ENTER_FRAME事件)中調(diào)用組件的相關(guān)驗證方法
3、把可視組件添加到舞臺
spark組件使用addElement,Halo組件使用addChild。
4、設(shè)置組件的parent屬性
5、計算組件的style設(shè)置
6、組件調(diào)度preinitialize事件
7、組件調(diào)用createChildren方法
Halo組件在createChildren方法中創(chuàng)建子組件,并偵聽子組件的相關(guān)事件。
而spark SkinnableComponent組件在createChildren方法中調(diào)用validateSkinChange→再調(diào)用attachSkin方法,在attachSkin方法中創(chuàng)建skin,添加到組件類顯示列表上,然后調(diào)用findSkinParts方法,循環(huán)skin實例中的皮膚部件,把每個皮膚部件的id和皮膚部件實例對象本身作為參數(shù)調(diào)用partAdded方法,組件開發(fā)者一般在partAdded方法中給皮膚部件添加事件偵聽。findSkinParts完成后,會調(diào)用invalidateSkinState方法(該方法僅檢測skinStateIsDirty布爾標(biāo)志變量是否為true,不為true則設(shè)為true,調(diào)用invalidateProperties方法)
8、調(diào)用失效方法
invalidateProperties,invalidateSize,
invalidateSkinState(僅spark SkinnableComponent組件),invalidateDisplayList;
9、組件調(diào)度initialize事件,此時子組件已創(chuàng)建完畢,但尚未布局、設(shè)置尺寸。
10、父容器組件調(diào)度elementAdd(spark)或childAdd(Halo)事件
11、父容器組件調(diào)度initialize事件
12、在SystemManager(Flex程序的真正主類)的下一個render事件調(diào)度時,組件調(diào)用相關(guān)的驗證方法如
commitProperties,measure(如果設(shè)置了顯示尺寸值,則不會調(diào)用),updateDisplayList。
spark SkinnableComponent組件的commitProperties方法會檢測skinStateIsDirty布爾標(biāo)志變量,如果為true,則會調(diào)用getCurrentSkinState方法獲取skin應(yīng)有的可視狀態(tài)State,然后將其設(shè)為skin的currentState屬性
13、如果在驗證方法調(diào)用的過程中,再次調(diào)用了失效方法,則會在SystemManager的再下一個render事件中,再次調(diào)用組件的驗證方法
14、最后一個render事件中,組件的驗證方法(沒有再次調(diào)用失效方法)執(zhí)行完畢后,設(shè)置組件visible為true,調(diào)度creationComplete事件(僅在組件創(chuàng)建完成時調(diào)度一次)
15、調(diào)度updateComplete事件??梢暯M件每次因為布局、位置、尺寸等變化而更新組件顯示完成后,都會調(diào)度updateComplete事件