组件生命周期

三大阶段:失效阶段,提交阶段,度量阶段


失效阶段:对组件属性setter函数中,若有发生改变,则标记属性失效,为了防止多次调用setter而导致频繁更改属性,所以调用属性失效函数,当当前ui存放进

layoutMannger的失效队列中,并添加layoutMannger的延迟侦听,在下一帧才进行相应的属性的失效的提交,确认属性更改后由此以后带动的连锁反应。



组件生命周期


涉及 提交阶段 度量阶段 布局阶段 
只有处理完当前阶段所有UI之后才会进入到下一阶段,在某个阶段中处理UI期间,可能出现另一阶段请求重现处理
UI的情况。这些请求将进行排列,并且只在下次运行此阶段才得到处理。
一、提交阶段
    提交阶段就是提交组件已变化的属性。在flex中,组件的某个属性值的变更可能会影响到其他的属性值,
比如scalex的水平拉升,可能会导致该组件的长宽或位置属性的变化。这里需要对这些会发生变更的属性进行相应
的计算。当在更新显示之前,scalex可能会频繁的发生变化,针对着这种情况,为了提高性能:
   故当组件属性发生变化的时候,在set 函数之中,首先标记属性失效,调用属性失效invalidateProperties()
函数,将相关属性的变更计算处理延迟到布局的提交阶段。
   


提交阶段:开始--
    从布局管理器调用自己的validateProperties()开始,在这个方法中,布局管理器按照组件嵌套层次的
"由外到内"的顺序遍历"属性失效队列"中的组件,调用每个"属性失效组件"的validateProperties()方法。也就是
说,最外层[嵌套深度最浅的对象]的"属性失效组件的"validateProperties()方法会最先被调用,如果是Application对
象的属性也失效了,
那么它的validateProperties()方法会最先被调用,这个遍历顺序又被称为"自顶向下"。
    在此阶段,允许内容依据属性设置耳钉的组件在进入度量和布局阶段之前进行自我配置,为了获得更好的性能,
组件的属性setter方法有时不执行更新到新属性值所需要的全部操作。但是,属性setter会调用
invalidateProperties()方法,并在运行此阶段之前延迟次操作。这样,就可以在多次设置属性时避免不必要的操作。
 eg:
protected function commitProperties():void


    {


        if (_scaleX != oldScaleX)


        {


            var scalingFactorX:Number = Math.abs(_scaleX / oldScaleX);


            if (!isNaN(explicitMinWidth))


                explicitMinWidth *= scalingFactorX;


            if (!isNaN(explicitWidth))


                explicitWidth *= scalingFactorX;


            if (!isNaN(explicitMaxWidth))


                explicitMaxWidth *= scalingFactorX;


            _width *= scalingFactorX;


            super.scaleX = oldScaleX = _scaleX;


        }


    }






二、度量阶段
   所谓度量(mearsurement)就是计算组件的默认尺寸,如果开发者显性的设置任何与组件高度和宽度相关的属性,
布局管理器就需要确定默认高度和宽度,否则无法完成布局。在设计人机界面时,我们经常从组件面板中拖放组件
界面设计器上,这是我们没有设定任何与尺寸有关的属性,但是组件能够以一个比较合适的比例展示出来,这个就
是组件度量所起的作用。


度量阶段:开始--
    度量阶段从布局管理器调用自己的validateSize()方法开始。[如果之前调用过对象invalidateSize,则调用
validateSize方法,如果对象的大小或位置因调用validateSize而发生更改,则会调用对象的invalidateDisplayList
方法,这就会将更改对象添加到处理队列中,等待下次运行布局阶段时进行处理。]在这个方法中,布局管理器按照组件嵌套层次
的"由内到外"的顺序遍历尺寸失效队列中的组件,调用每个"尺寸失效组件"的invalidateSize()方法。也就是说
,越在外层的"尺寸失效组件"的invalidateSize(方法)月后调用。如果Application对象的尺寸也失效了,那么它
的invalidateSize()方法越后被调用,这个遍历顺序又被称为"自底而上"。
    "尺寸失效组件"的invalidateSize()方法调用该组件的measure()方法来确定"尺寸失效组件"的默认大小。
组件的measure()方法是个protected方法,组件开发者应在自定义的UI子类中重载这个方法,完成组件默认尺寸
相关属性的设置和计算。在这个方法中,主要是确定和计算measuredMinWidth、measuredMinHeight、measuredWidth
、measuredHeight等表示最小宽度,最小默认高度,默认宽度,默认高度的属性值。





































对于有组件的容器来说,updateDisplayList()方法控制那些子组件该如何确定位置。比如,Hbox容器的
updateDisplayList()方法在一行上按照从左到右的顺序确定子组件的位置。Vbox容器的updateDisplayList
方法在一列上按照从上到下的顺序确定子组件的位置。要在updateDisplayList()方法中确定一个组件的大小,
应当使用setActualSize()方法,而不是使用与组件大小相关的属型,诸如width和height。要确定组件的为位置
,应当使用move()方法,而不是x和y属性。




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


属性有以下值:
unscaledWidth
指定组件的宽度,像素为单位,在组件的坐标系中,不管组件的scaleX属性值是多少,这个值就是有父容器所确定的
组件宽度。
unscaleHeight
指定组件的高度,以像素为单位,在组件的坐标系中。不管组件的scaleY属性值是多少,这个值就是由父容器所确定
的组件高度。
 缩放发生在Flash Player或者AIR中,发生时机是在updateDisplayList()执行之后,比如,一个组件的unscaleHeight
,而其scaleY属性石2.0,那么它在Flash Player或AIR中出现的高度为200像素。


move()和直接使用x,y定义坐标的区别在于move()方法不仅改变组件的位置,而且在调用这个方法之后
立即分发了一个move事件,设置x,y属性也更改组件的位置,但却在下一个更新事件中分发move事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值