flex组件显示流程.docx
- 文档编号:646057
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:17
- 大小:105.16KB
flex组件显示流程.docx
《flex组件显示流程.docx》由会员分享,可在线阅读,更多相关《flex组件显示流程.docx(17页珍藏版)》请在冰豆网上搜索。
flex组件显示流程
RIACoder
RIA,Mobile,Java程序员
Search
Mainmenu
Skiptoprimarycontent
Skiptosecondarycontent
▪Home
▪关于
Postnavigation
←PreviousNext→
深入浅出Flex组件生命周期Part4─引擎LayoutManager
Postedon2011/08/13by董龙飞
从Part4,我们开始真正的Spark组件生命周期探险旅程。
一.小结
我们已经知道,Spark组件实际上由两个UIComponent构成,一个是所谓的Skin类,一个是所谓的Component类。
Component类负责管理数据和逻辑,Skin类负责管理可视化。
在不同的场合和微博上,在Spark组件发布已近两年的今天,我仍然听到很多人在抱怨Spark和Halo的不同。
那么,阅读过本系列文章之后,你会发现,Spark只不过为传统的Halo组件增加了一个UIComponent(即Skin类),把一个UIComponent组件的工作拆分给了两个UIComponent组件。
并不是你所想象的那样翻天覆地的变化。
既然二者都是UIComponent,那么本质上,两个UIComponent都要遵从UICompnent组件的生命周期,就是那个著名的三阶段:
commitProperties(),measure()和updateDisplayList(),当然也包括对应的invalidate方法。
如果你还不甚了解三阶段构成的组件生命周期和对应的invalidate方法,那么请就此打住,先参考UsingAdobeFlex4.5理解组件生命周期的基本知识,然后再回到本文。
如果我们已经对此达成共识,那么让我们开始吧。
二.引擎:
每个稍有经验的Flex开发者,都知道组件生命周期的三阶段commitProperties(),measure()和updateDisplayList()。
但很少有人深究过其自何处,这导致Flex组件的生命周期对很多开发者几乎成为一个神秘的神话。
实际上,
2.1/引自ActionScript3语言参考:
关于LayoutManager
看一下LayoutManager类提供的部分主要方法:
invalidateProperties(),invalidateSize(),invalidateDisplayList(),validateProperties(),validateSize(),validateDisplayList()…你是否发现这些组件生命周期中的神秘方法?
如ActionScript3参考中所说:
LayoutManager是Flex的度量和布局策略所基于的引擎。
在ActionScript3语言参考之LayoutManager类中讲到:
LayoutManager是Flex的度量和布局策略所基于的引擎。
布局分三个阶段执行:
提交、度量和布局。
这三个阶段互不相同,并且,只有在处理完当前阶段的所有UIComponent之后才会进入下一阶段。
在某个阶段中处理UIComponent期间,可能出现另一阶段请求重新处理UIComponent的情况。
这些请求将进行排队,并且只在下次运行此阶段时才得到处理。
提交阶段从调用validateProperties()开始,该方法将遍历一个对象列表(该列表按嵌套级别反向排序),并调用每个对象的validateProperties()方法。
列表中的对象是按与嵌套级别正相反的顺序接受处理的,所以最先访问的是嵌套深度最浅的对象。
这也可以称为自上而下或从外到内的顺序。
在此阶段中,允许内容依据属性设置而定的组件在进入度量和布局阶段之前进行自我配置。
为了获得更好的性能,组件的属性setter方法有时不执行更新到新属性值所需的全部操作。
但是,属性setter会调用invalidateProperties()方法,并在运行此阶段之前延迟此操作。
这样,可以在多次设置属性时避免执行不必要的操作。
度量阶段从调用validateSize()开始,该方法将遍历一个对象列表(该列表按嵌套级别排序),并调用每个对象的validateSize()方法,以确定对象大小是否已更改。
如果之前调用过对象的invalidateSize()方法,则调用validateSize()方法。
如果对象的大小或位置因调用validateSize()而发生了更改,则会调用对象的invalidateDisplayList()方法,这就会将该对象添加到处理队列中,等待下次运行布局阶段时进行处理。
此外,已分别调用invalidateSize()和invalidateDisplayList()为度量和布局这两个阶段标记了对象的父项。
列表中的对象是按嵌套级别的顺序进行处理的,所以最先访问的是嵌套深度最深的对象。
这也可以称为自下而上或从内到外的顺序。
布局阶段从调用validateDisplayList()方法开始,该方法将遍历一个对象列表(该列表按嵌套级别反向排序),并调用每个对象的validateDisplayList()方法,以请求对象确定它所包含的所有组件(即其子对象)的大小和位置。
如果之前调用过对象的invalidateDisplayList()方法,则调用validateDisplayList()方法。
列表中的对象是按与嵌套级别正相反的顺序接受处理的,所以最先访问的是嵌套深度最浅的对象。
这也可以称为自上而下或从外到内的顺序。
通常情况下,组件不会覆盖validateProperties()、validateSize()或validateDisplayList()方法。
对于UIComponent而言,大部分组件都会覆盖分别由validateProperties()、validateSize()或validateDisplayList()方法调用的commitProperties()、measure()或updateDisplayList()方法。
当应用程序启动时,将创建一个LayoutManager实例并将其存储在UIComponent.layoutManager属性中。
所有组件都应使用此实例。
如果您无权访问UIComponent对象,也可以使用静态LayoutManager.getInstance()方法访问LayoutManager。
2.2/LayoutManager来自何处
所有的UIComponent组件都通过layoutManager属性访问其LayoutManager,更重要的是,这些LayoutManager都指向一处。
是的,我要说的其实是:
LayoutManager类是一个单体类。
当应用程序启动时,将创建一个LayoutManager实例并将其存储在UIComponent.layoutManager属性中。
所有组件都应使用此实例。
查看,可以看到:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
publicfunctionApplication()
{
UIComponentGlobals.layoutManager=ILayoutManager(
Singleton.getInstance("mx.managers:
:
ILayoutManager"));
=true;
if(!
FlexGlobals.topLevelApplication)
FlexGlobals.topLevelApplication=this;
super();
showInAutomationHierarchy=true;
initResizeBehavior();
}
需要注意的是,这里默认设置了LayoutManager的usePhasedInstantiation属性为true。
我们在下文中将会谈到该属性。
而查看LayoutManager类,你会看到如下getInstance()方法:
1
2
3
4
5
6
7
publicstaticfunctiongetInstance():
LayoutManager
{
if(!
instance)
instance=newLayoutManager();
returninstance;
}
可以想象,LayoutManager是一个多么繁忙而重要的类,Flex应用程序中所有可视化组件的度量和布局都由这一个类实例推动。
2.3/invalidate方法
在本文中,当说起invalidate方法,我的意思是invalidateProperties(),invalidateSize()和invalidateDisplayList()方法。
然而,如果更严谨地说,有两套invalidate方法。
LayoutManager的invalidate方法和UIComponent的invalidate方法。
UIComponent的invalidate方法
Flex开发者通常调用的是UIComponent类的invalidate方法。
调用该方法来确保Flex在Flash下一帧调用对应的commitProperties,measure和updateDisplayList方法。
我们以UIComponent类的invalidateProperties()方法为例:
1
2
3
4
5
6
7
8
9
10
publicfunctioninvalidateProperties():
void
{
if(!
invalidatePropertiesFlag)
{
invalidatePropertiesFlag=true;
if(nestLevel&&UIComponentGlobals.layoutManager)
;
}
}
实际上,UIComponent的invalidate方法是个“假李逵”,UIComponent的invaliate方法最终会调用LayoutManager类的invalidate方法。
因此,更严谨地说,在本文中,当说器invalidate方法时,我的意思是LayoutManager类的invalidateProperties(),invalidateSize()和invalidateDisplayList()方法。
LayoutManager的invalidate方法
我们以invalidateProperties()方法为例,看一下invalidate方法的具体工作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
publicfunctioninvalidateProperties(obj:
ILayoutManagerClient):
void
{
if(!
invalidatePropertiesFlag&&systemManager)
{
invalidatePropertiesFlag=true;
if(!
listenersAttached)
attachListeners(systemManager);
}
//trace("LayoutManageradding"+Object(obj)+"toinval
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- flex 组件 显示 流程