我在flex开发人员指南中读到你有时需要覆盖其中一个生命周期方法,例如:commitProperties和updateDisplayList,但我写了一些flex应用程序而不需要实现它们.我什么时候需要覆盖它们?
首先,我100%建议由EffectiveUI学习这个演讲:
这是来自Digital Primates的Michael Labriola:
它们会进入您在文档中永远找不到的内容,但这些内容对于理解Flex组件生命周期非常实用.
根据我的经验,您唯一需要担心重写核心生命周期方法的方法是创建组件.我区分了应用程序视图和组件.
在大多数情况下,视图只是将内容添加到更通用的组件(Canvas,Group,Container,VBox,List等)的显示列表中.作为视图/应用程序开发人员,您并不真正关心"dataProvider"如何创建它的itemRenderers,它只是起作用.
组件是一个不同的故事.创建组件时,您希望它完全适合Flex设置的系统:组件生命周期.当你第一次尝试像他们一样构建一个组件时,这是非常艰难的,但是在你绕过它之后,这非常容易.以下是我在开发组件时对方法的看法:
createChildren()
Panel调用createChildren,它的createChildren方法将调用addChild它的所有子节点,即调用initialize哪些调用createChildren.如果您创建了一个自定义组件,比如StarRatingComponent,则可能需要在构建组件时向舞台添加5颗星.因此,您可以覆盖createChildren()为您所在的组件添加星标.但是,默认情况下,Flex SDK中的所有Container组件都会在此处添加其子项(列表执行方式略有不同),因此您无需执行此操作您正在构建MXML视图或不可重用的东西.
在设置属性后,接下来的3个方法称为1帧.
测量()
measure如果您想要覆盖:
measuredWidth或measuredHeight返回有用的值.因此,如果您构建自定义CoverFlowContainer组件,并且measuredWidth/measuredHeight未设置(因为measure未覆盖),那么如果您未在CoverFlowContainer上指定任何大小,则它将为0宽度0高度.所以相反,覆盖measure并将其设置measuredWidth为radius * 2或类似的东西,现在你不需要给它一个大小!的commitProperties
measure.在我看来,这是最重要的方法.因此,对于CoverFlowContainer,假设您设置了假设distance,gap和selectedItem,以及tilt属性.设置它们时,将它们存储在私有变量中.Flex将等待一帧,并打电话commitProperties.在你被覆盖的时候commitProperties,你可以layout.updateEverything(selectedItem, distance, gap, tilt);这么说.因此,这是您重写的方法,以便立即应用所有属性更改.
的updateDisplayList
commitProperties你只覆盖此设置组件的可见性,如setActualSize,graphics等,但现在(因为`的commitProperties),你有你的所有必需的变量更新将显示器设置为正确的价值观.
总体
因此,根据我的经验,在为一百万个项目中使用的内容创建组件库时,我为这些生命周期方法做了大量工作:
我需要确保所有内容都根据生命周期进行了更新和完美呈现.阅读和理解Flex 4 Spark源代码确实有助于阐明何时覆盖这些方法.和Openflux源代码一样(非常简单,清晰的Flex框架替代方案.不像功能丰富,因此它显示了如何彻底覆盖这些方法来完成一些非常高级的东西).
当我开发的应用程序,使之类的东西AdvertismentView,MenuView而且LoginView,我从来没有去想它,因为所有我使用的部件都已经解决了这些问题(ViewStack,集团,列表等).我基本上只是设置他们在自己的commitProperties覆盖中定义和更新的属性.
我开始在View中重写生命周期方法的唯一一次是当我需要从视图外部访问自定义变量时.所以说我有一个自定义的RichTextEditor,我创建了一些名为showFontControls和的属性showStylePanel.当我设置这些变量时,我可能会做他们在数据绑定演示中描述的内容:访问者设置私有变量并调用失效方法,生命周期方法稍后执行一帧,我已覆盖commitProperties并updateDisplayList显示这些面板和字体.但实际上,这可能是一种过度杀伤力,因为它不会为它所需的工作量提供那么多的性能提升.visible在这种情况下,我只是为一个属性设置了一些绑定.然而....
要真正做到这一点,最好的办法就是下载Flex SDK Source并查看它们正在做什么.
希望有所帮助.
长矛
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |