深入學習Flex組件生命周期
本文向大家簡單介紹一下Flex組件生命周期,使用set,get設置Flex組件屬性,常在set方法內監控一個布爾變量來實現失效機制。
深入學習Flex組件生命周期
1、生命周期(LifeCycle)簡述
⑴調用Flex組件構造函數。構造函數沒有返回類型,沒有參數,使用super()調用父類的構造器
⑵使用set,get設置Flex組件屬性,常在set方法內監控一個布爾變量來實現失效機制
⑶調用addChild()方法將Flex組件添加到父Flex組件顯示列表中,FLEX將自動調用createChildren(),invalidateProperties(),invalidateSize(),invalidateDisplayList()。只有將Flex組件添加到父容器中,FLEX才能確定它的大小(size),設置它所繼承樣式(style)屬性,或者在屏幕上畫出它
⑷Flex組件的parent屬性設置為對父容器的引用
⑸樣式(style)設置
⑹Flex組件分發preinitialize事件
⑺調用Flex組件createChildren()方法
⑻調用invalidateProperties(),invalidateSize(),invalidateDisplayList()失效方法,FLEX將在下一個“渲染事件”(renderevent)期間對相應的commitProperties(),measure(),updateDisplayList()方法進行調用。這個規則唯一例外就是當用戶設置Flex組件的height和width屬性時,Flex不會調用measure()方法。也就是說,只有當Flex組件的explicitWidth和explicitHeight屬性是NaN時Flex才會調用measure()方法。
⑼Flex組件分發initialize事件。此時Flex組件所有的子Flex組件初始化完成,但Flex組件尚未更改size和布局,可以利用這個事件在Flex組件布局之前執行一些附加的處理
⑽在父容器上分發childAdd事件
⑾在父容器上分發initialize事件
⑿在下一個“渲染事件”(renderevent)中,Flex執行以下動作:
a.調用Flex組件的commitProperties()方法
b.調用Flex組件的measure()方法
c.調用Flex組件的layoutChrome()方法
d.調用Flex組件的updateDisplayList()方法
e.在Flex組件上分發updateComplete事件
⒀如果commitProperties(),measure(),updateDisplayList()方法調用了invalidateProperties(),invalidateSize(),invalidateDisplayList()方法,則Flexh會分發另外一個render事件
⒁在最后的render事件發生后,Flex執行以下動作:
a.設置Flex組件visible屬性使其可視
b.Flex組件分發creationComplete事件,Flex組件的大小(size)和布局被確定,這個事件只在Flex組件創建時分發一次
c.Flex組件分發updateComplete事件。無論什么時候,只要Flex組件的布局(layout),位置,大小或其它可視的屬性發生變化就會分發這事件,然后更新Flex組件來正確地顯示。
2、為什么使用失效機制(invalidationmechanism)
一種情況是,當設置了Flex組件的多個屬性后,比如Button控件的label和icon屬性,我們需要所有屬性被設置后一次性執行commitProperties(),measure(),updateDisplayList()方法,而不是設置過label屬性后執行一遍這些方法,然后在設置icon屬性后又執行一次這些方法。
另一種情況是幾個Flex組件同時更改了它們的字體大小。程序更改字體大小的執行速度大大快于Flex更新應用的速度,因此要在確定最終更改字體之后才開始更新布局。另外,Flex需要協調布局操作以消除任何冗余過程,而不是在每個Flex組件更新它的字體大小之后都執行一次布局操作。
Flex使用“失效機制(invalidationmechanism)”來同步Flex組件的更改。Flex用一系列方法的調用,比如在setter方法內監控一個變更變量來標記Flex組件的某些東西已經發生變化,然后在下一個“渲染事件(renderevent)”中觸發Flex組件的commitProperties(),measure(),layoutChrome(),updateDisplayList()檢查這些布爾變量來完成最終的變更邏輯。這樣做的額外好處就是setter方法可以更迅速地返回,把對新屬性值的處理留給了commitProperties()方法。
失效方法及其對應的觸發函數如下:
invalidateProperties()通知Flex組件,以使下次屏幕更新時,它的commitProperties()方法被調用。
invalidateSize()通知Flex組件,以使下次屏幕更新時,它的measure()方法被調用。
invalidateDisplayList()通知Flex組件,以使下次屏幕更新時它的layoutChrome()方法和
updateDisplayList()方法能被調用。
當Flex組件調用一個“失效”方法時,它就通知Flex該Flex組件已經被更新。當多個Flex組件調用失效
方法,Flex會在schedules中協調這些更新,以使這些更新操作在下一次屏幕更新時一起執行。注意,createChildren()沒有對應的失效方法,它會在調用后被立即執行。
【編輯推薦】