理解 Flex 4 组件生命周期(3)

layoutChrome()

layoutChrome()是 Halo 专用的函数。在 Flex 4 组件里面并没有与之对应的函数或者阶段。这里仅仅为了能够比较完整的介绍整个 Flex 组件的生命周期,才会简单讲解一下这个函数。如果你只是用 Flex 4,就完全可以跳过这部分。

layoutChrome()函数的思想是,组件的 style 和 可视化的计算要与其内容分离开。大多数时候,完全分离并没有必要,因为你可以很容易地将它们一起管理好。但是,如果组件的autoLayout设置为false,你就应当注意可能出现的问题。因为当autoLayout设置为true的时候,当子组件的位置或者大小发生改变的时候,组件会自动重新计算自己的大小。因此,当容器或者其内容发生改变的时候,二者都可以被修改,以便容纳所有内容。这就是为什么绝大多数 Flex 容器都会默认设置这个值。当autoLayout设置为false的时候,Flex 仅在子组件添加或删除的时候才会进行重新计算。这一点对于与其它 layout 的代码混合在一起的边框来说并没有太大的意义。因为当它更新自己的时候,很可能与其他代码产生冲突,从而出现 layout 错误的问题。

幸运的是,即使autoLayout被设置为false,Flex 也会调用layoutChrome()函数。所以,只要你将组件的 layout 重新计算的代码放在这个函数中,不管其它组件设置成什么值,只要发生位置或者大小的改变,都能够用这里的代码正确的展示你的组件。但是,不要为了方便把所有可视化组件的更新都放在这个函数中。许多组件并不需要这样做,因为它们能够立即更新自身或许子组件。然而,如果你创建的是一个基于容器的组件,这个函数就应该被正确地实现。

updateDisplayList()

现在我们已经了解到如何更新组件的属性和大小。这一切都准备停当之后,最后一个重要的函数就是,定义如何让我们的组件正确地显示出来。这就是updateDisplayList()函数。

updateDisplayList()函数是你的组件被显示出来之前的最后一步。它负责定义所有子组件的属性、位置和尺寸。此时,父容器已经计算出组件的最终大小,如果还有任何需要修改的地方,那么,在组件真正显示出来之前,这就是最后的地方了。

一个如此重要的函数,它的描述却很简单。也许你觉得,updateDisplayList()measure()似乎有一些重复。然而,measure()仅仅在你没有设置widthheight的时候才会调用一次,如果你设置了,那么该怎样制定组件的初始大小呢?显然,你应该在updateDisplayList()函数中指定。在 Flex 组件生命周期涉及到的所有函数中,updateDisplayList()是唯一一个具有参数的。但是,与其他函数一样,这个函数也不应该由开发者去调用,而是由 Flex 框架调用。

updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void

这两个参数由invalidateDisplayList()在调用时传进来,使用的是组件自己的坐标系统,而不是父组件的。正如它们的名字显示的那样,unscaledWidthunscaledHeight没有任何缩放,它们将直接应用到组件上面。所以,使用这两个值去计算你的组件和子组件的大小,而不是widthheight,因为widthheight可能已经经过一定的缩放了。

至此,我们已经将 Flex 4 组件的生命周期完整的介绍了一遍。掌握这些函数的作用,对我们开发自己的组件、深入学习 Flex 的显示机制都会有很大的帮助。

2 Comments

  1. FLEX 2011年8月30日
    • DevBean 2011年8月30日

Leave a Reply