mx.managers
接口public interface ILayoutManager extends IEventDispatcher
实现器 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。



公共属性
 属性定义方
  usePhasedInstantiation : Boolean
一个标志,用于指示 LayoutManager 是否允许在各个阶段之间更新屏幕。
ILayoutManager
公共方法
 方法定义方
 Inherited
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。
IEventDispatcher
 Inherited
将事件调度到事件流中。
IEventDispatcher
 Inherited
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。
IEventDispatcher
  
当组件发生的更改导致其布局和/或视觉效果需要更改时调用。
ILayoutManager
  
向希望调用其 validateProperties() 方法的组件的列表中添加一个对象。
ILayoutManager
  
向希望调用其 validateSize() 方法的组件的列表中添加一个对象。
ILayoutManager
  
如果存在需要验证的组件,则返回 true;如果已经验证所有组件,则返回 false。
ILayoutManager
 Inherited
removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
从 EventDispatcher 对象中删除侦听器。
IEventDispatcher
  
validateClient(target:ILayoutManagerClient, skipDisplayList:Boolean = false):void
当属性发生更改后,组件通常不会立即应用这些更改,
ILayoutManager
  
当属性发生更改后,组件通常不会立即应用这些更改,
ILayoutManager
 Inherited
检查是否用此 EventDispatcher 对象或其任何始祖为指定事件类型注册了事件侦听器。
IEventDispatcher
属性详细信息
usePhasedInstantiation属性
usePhasedInstantiation:Boolean  [读写]

一个标志,用于指示 LayoutManager 是否允许在各个阶段之间更新屏幕。如果为 true,则在各阶段都会进行度量和布局,每个阶段结束后都会更新一次屏幕。所有组件都将调用其 validateProperties()commitProperties() 方法,直到验证完各自的所有属性。屏幕将随之更新。

然后,所有组件都将调用其 validateSize()measure() 方法,直到测量完所有组件,屏幕也将再次更新。

最后,所有组件都将调用其 validateDisplayList()updateDisplayList() 方法,直到验证完所有组件,屏幕也将再次更新。如果正在验证某个阶段,并且前面的阶段失效,则会重新启动 LayoutManager。当创建和初始化大量组件时,此方法更为高效。框架负责设置此属性。

如果为 false,则会在更新屏幕之前完成所有这三个阶段。



实现
    public function get usePhasedInstantiation():Boolean
    public function set usePhasedInstantiation(value:Boolean):void
方法详细信息
invalidateDisplayList()方法
public function invalidateDisplayList(obj:ILayoutManagerClient):void

当组件发生的更改导致其布局和/或视觉效果需要更改时调用。在这种情况下,即使没有更改过组件的大小,也必须运行组件的布局算法。例如,当添加了新的子组件时、样式属性发生更改时或组件的父项为组件赋予了新尺寸时。

参数

obj:ILayoutManagerClient — 更改过的对象。

invalidateProperties()方法 
public function invalidateProperties(obj:ILayoutManagerClient):void

向希望调用其 validateProperties() 方法的组件的列表中添加一个对象。组件应在属性发生更改时调用此方法。通常,属性 setter 方法将新值存储在临时变量中,然后调用 invalidateProperties() 方法,以便稍后在新值实际应用到组件和/或其子项时调用其 validateProperties()commitProperties() 方法。此策略非常适用于以下经常遇到的情况:一次更改多个属性,并且这些属性之间可能会交互;在应用代码时需重复某些代码或需要按一定顺序应用代码。此策略可以为应用新属性值提供最有效的方法。

参数

obj:ILayoutManagerClient — 属性已发生更改的对象。

invalidateSize()方法 
public function invalidateSize(obj:ILayoutManagerClient):void

向希望调用其 validateSize() 方法的组件的列表中添加一个对象。当对象的大小发生更改时调用。

导致对象大小发生更改的原因有两个:

  1. 对象的内容发生更改。例如,在更改按钮的 label 时更改了此按钮的大小。
  2. 脚本可显式更改下列属性之一:minWidthminHeightexplicitWidthexplicitHeightmaxWidthmaxHeight

发生第一种情况时,必须重新计算对象的测量值。发生第二种情况时,则不必重新计算测量值,因为对象的新尺寸是已知的。但是,必须重新测量和重新布局对象的父项。

参数

obj:ILayoutManagerClient — 大小已发生更改的对象。

isInvalid()方法 
public function isInvalid():Boolean

如果存在需要验证的组件,则返回 true;如果已经验证所有组件,则返回 false

返回
Boolean — 如果存在需要验证的组件,则返回 true;如果已经验证所有组件,则返回 false
validateClient()方法 
public function validateClient(target:ILayoutManagerClient, skipDisplayList:Boolean = false):void

当属性发生更改后,组件通常不会立即应用这些更改,而是会调用 LayoutManager 的一个 invalidate 方法,并在稍后应用这些属性。可以立即重新读取实际设置的属性,但如果该属性会影响组件或者其子项或父项中的其它属性,则可能不会立即更新这些受影响的属性。

要保证已更新这些值,可以调用 validateClient() 方法。它会在返回之前更新嵌套级别大于或等于目标组件的所有组件中的所有属性。仅在必要时才调用此方法,因为调用此方法需要进行大量计算。

参数

target:ILayoutManagerClient — 传入的组件用于测试应该验证哪些组件。将调用此组件中包含的所有组件的 validateProperties()commitProperties()validateSize()measure()validateDisplayList()updateDisplayList() 方法。
 
skipDisplayList:Boolean (default = false) — 如果为 true,则不调用 validateDisplayList()updateDisplayList() 方法。

validateNow()方法 
public function validateNow():void

当属性发生更改后,组件通常不会立即应用这些更改,而是会调用 LayoutManager 的一个 invalidate 方法,并在稍后应用这些属性。可以立即重新读取实际设置的属性,但如果该属性会影响组件或者其子项或父项中的其它属性,则可能不会立即更新这些受影响的属性。要保证已更新这些值,可以调用 validateNow() 方法。它会在返回之前更新所有组件中的所有属性。仅在必要时才调用此方法,因为调用此方法需要进行大量计算。