`

深入理解FLEX组件生命周期[转]

    博客分类:
  • Flex
 
阅读更多

1、生命周期( LifeCycle )简述

⑴调用组件构造函数。构造函数没有返回类型,没有参数,使用 super() 调用父类的构造器

⑵使用 set,get 设置组件属性,常在 set 方法内监控一个布尔变量来实现失效机制

⑶调用 addChild() 方法将组件添加到父组件显示列表中, FLEX 将自动调用 createChildren() invalidateProperties() invalidateSize() invalidateDisplayList() 。只有将组件添加到父容器中, FLEX 才能确定它的大小 (size) ,设置它所继承样式 (style) 属性,或者在屏幕上画出它

⑷组件的 parent  属性设置为对父容器的引用

⑸样式 (style) 设置

组件分发 preinitialize 事件

调用组件 createChildren() 方法

调用  invalidateProperties() invalidateSize() invalidateDisplayList() 失效方法, FLEX 将在下一个“渲染事件” (render event) 期间对相应的 commitProperties() measure()  updateDisplayList() 方法进行调用。这个规则唯一例外就是当用户设置组件的 height  width  属性时 , Flex  不会调用 measure() 方法。也就是说,只有当组件的 explicitWidth  explicitHeight  属性是 NaN  Flex 才会调用 measure() 方法。

组件分发 initialize 事件。此时组件所有的子组件初始化完成,但组件尚未更改 size 和布局,可以利用这个事件在组件布局之前执行一些附加的处理

在父容器上分发 childAdd 事件

在父容器上分发 initialize 事件

在下一个“渲染事件” (render event) , Flex  执行以下动作:

a. 调用组件的 commitProperties() 方法

b. 调用组件的 measure() 方法

c. 调用组件的 layoutChrome() 方法

d. 调用组件的 updateDisplayList() 方法

e. 在组件上分发 updateComplete 事件

如果 commitProperties()  measure() updateDisplayList() 方法调用了 invalidateProperties() invalidateSize() invalidateDisplayList() 方法,则 Flexh  会分发另外一个 render 事件

在最后的 render 事件发生后 , Flex 执行以下动作:

a. 设置组件 visible 属性使其可视

b. 组件分发 creationComplete 事件,组件的大小 (size) 和布局被确定,这个事件只在组件创建时分发一次

c. 组件分发 updateComplete 事件。无论什么时候,只要组件的布局 (layout) ,位置,大小或其它可视的属性发生变化就会分发这事件,然后更新组件来正确地显示。

2、为什么使用失效机制( invalidation mechanism)

一种情况是,当设置了组件的多个属性后,比如 Button  控件的 label  icon  属性,我们需要所有属性被设置后一次性执行 commitProperties(), measure(), updateDisplayList() 方法,而不是设置过 label  属性后执行一遍这些方法,然后在设置 icon 属性后又执行一次这些方法。

另一种情况是几个组件同时更改了它们的字体大小。程序更改字体大小的执行速度大大快于 Flex  更新应用的速度,因此要在确定最终更改字体之后才开始更新布局。另外, Flex  需要协调布局操作以消除任何冗余过程,而不是在每个组件更新它的字体大小之后都执行一次布局操作。

Flex  使用“失效机制( invalidation mechanism )”来同步组件的更改。 Flex  用一系列方法的调用,比如在 setter 方法内监控一个变更变量来标记组件的某些东西已经发生变化,   然后在下一个“渲染事件( renderevent )”中触发组件的 commitProperties(), measure(), layoutChrome() updateDisplayList() 检查这些布尔变量来完成最终的变更逻辑。这样做的额外好处就是 setter 方法可以更迅速地返回,把对新属性值的处理留给了 commitProperties() 方法。

失效方法及其对应的触发函数如下:

invalidateProperties()  通知组件,以使下次屏幕更新时,它的 commitProperties() 方法被调用。

invalidateSize()  通知组件,以使下次屏幕更新时,它的 measure() 方法被调用。

invalidateDisplayList()  通知组件,以使下次屏幕更新时它的 layoutChrome() 方法和

updateDisplayList() 方法能被调用。

当组件调用一个“失效”方法时,它就通知 Flex 该组件已经被更新。当多个组件调用失效

方法, Flex  会在 schedules 中协调这些更新,以使这些更新操作在下一次屏幕更新时一起执行。注意, createChildren() 没有对应的失效方法,它会在调用后被立即执行。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics