Flex 中 的 IInvalidating 接口

    小弟学Flex近两年,最近在actionscript 3 论坛看到了有人问“为啥不能通过代码设置TitleWindow的关闭按钮”的问题,让我想把 Flex的IInvalidating 接口实现机制和大家分享一下,不对之处还请 指正、批评。

 

    在flex的帮助里、Essential.ActionScript.3.0 的23章的Event.Render 优化、和LayoutManager.as 的文档说明里面有讲,程序基于Event.Render的好处。LayoutManager的实现机制就是基于Event.Render来实现的。

 

    LayoutManager.as 的说明文档里面有这么说,说,LayoutManager类是Flex的measurement 和 layout 策略,表现为3个阶段 commit 、measurement、layout,上个阶段处理完了才会到下个阶段。commit 阶段是从调用 validateProperties()开始的,一般不用直接调用validateProperties(),调用invalidateProperties()即可,他会将 invalidatePropertiesFlag = tue并最终导致 commitProperties()中代码的执行,以便在下一次的commit 阶段到来时执行,同样validateSize用invalidateSize()、validateDisplayList用invalidateDisplayList()。

 

    在Applications启动的过程中,commitProperties 会从外到里执行一遍,measure 会从里到外执行一遍,然后在 updateDisplayList 从 外到里执行一遍。这样的一个执行顺序,用下面一个就会很好的理解了。

 


 

 

 

    哦,对了,callLater也是基于的 Event.Render,原理和上面差不多。因为flash不会打断当前的代码执行,而去更新屏幕,所以要到当前所有的代码都执行完了之后,如果需要更新屏幕,才会去更新,并发出EnterFrame事件(EnterFrame发出和是否有屏幕更新无关),然后才会去 检查 invalidatePropertiesFlag是否为 true 如果是 则 执行 commitProperties(),其他几个阶段同理。

 

  至于为什么要这样做,这样做的好处,在flex的帮助里、Essential.ActionScript.3.0 的23章的Event.Render 优化、和LayoutManager.as 的文档说明里面有讲,我这里举个简单的例子,

 

   比如,如果你想改变一个text的 color 和 width,你直接去改他的颜色和大小是一个浪费资源的动作,想想如果有很多的text还要改很多次,是不是每次都要执行n下,但是采用这种机制 把他的颜色和大小更改等放在 commitProperties() 和 updateDisplayList()来做,不管你修改多少次,修改的只是数值,最终只执行一次,是不是很 efficient。

 

 

  拿““为啥不能通过代码设置TitleWindow的关闭按钮””为例

 

<mx:TitleWindow id="titleWindow" x="148" y="140" width="250" height="200" layout="absolute" showCloseButton="false">

 因为,_showCloseButton属性是在 Panel 中定义的,在TitleWindow 定义为接口的,它只是一个属性标识。在如上的mxml里写的 showCloseButton = "true" 或 “"false" ,而组件初始化时,会自动经历 3 个阶段,showCloseButton真正设置它的可见是在 layoutChrome()中执行。而 layoutChrome()是在 updateDisplayList()加入的,这是在 Container里面的定义的,至于layoutChrome()的作用或则说那些代码放在里面,看下 Flex 的 Help吧。所以,如果在代码里改 showCloseButton = true 时,需要invalidateDisplayList()一下。

 

 

 

 

你可能感兴趣的:(Flex,Flash,actionscript)