About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jan

    22

    Feathers3 “组件生命周期”一些备注

    • 0 Comments
    • Flash Platform
    • 发布:古树悬叶
    • 引用:0
    • 浏览:

    Feathers3 “组件生命周期(Feathers Component Lifecycle)”经历以下几个过程:

    1、实例化(Instantiation)

    通过关键字 new 生成对象,此时组件还没有被添加到显示列表上,可以任意修改属性,此时组件不会进行任何渲染,直到它被添加到显示列表中才会对显示相关的属性作出反应。有一个宗旨就是尽量减少在构造函数中初始化相关的代码量(除非是没有被添加到显示列表前,就需要确定的初始化相关的代码才 需要在构造函数中完成),初始化相关的代码尽量放在下面介绍的 initialize() 方法中。

    2、初始化(Initialization)

    组件被添加到显示列表后,initialize() 方法被自动调用,这个方法只会在组件第一次被添加到显示列表时被调用(只会被调用一次,如果将它从显示列表移除,再重新添加也兴地再次运行),开发者可以覆盖这个方法进行子对象相关的布局,其它初始化相关的代码也要尽量放在这个方法体内,尽量减少构造函数中初始化相关的代码。这个方法体内的所有代码执行结束后,会派发一个 FeathersEventType.INITIALIZE 事件,表示初始化方法 initialize() 执行结束了。

    如果一个组件在被添加到显示列表前调用了 validate() 方法,那么 initialize() 方法会被立即执行(请注意:FeathersEventType.INITIALIZE 与 FeathersEventType.CREATION_COMPLETE 事件也会被派发;后续的操作再将这个组件添加到显示列表时就不会再执行 initialize() 方法,也不会再派发这些事件了)。

    3、应用主题样式(Apply theme styles)

    一般来说,使用 Feathers 进行开发的时候,都会有一个主题文件(theme,也不排除一些开发者会直接在业务逻辑相关的类中直接进行皮肤样式的设置而不使用主题文件,但这是不推荐的),在 FeathersEventType.INITIALIZE 事件派发后,会立即应用主题文件的样式属性设置到组件上(如果没有主题文件, 此过程就被跳过了)。

    4、验证(Validation)

    组件进入第一次验证阶段,此时组件的所有属性就好像都已失效(关于失效,查看下面的 Invalidation 过程介绍),会进行一次完成的属性处理。当第一次验证结束后,会派发一个 FeathersEventType.CREATION_COMPLETE 事件(也就是在第一次 draw() 方法后会派发这个事件)。

    当进行验证操作的时候,组件会调用 draw() 方法,任何组件已更改的属性会在 draw() 方法中进行处理。如果对组件没有进行手动坐标、尺寸设置,组件需要根据预置配置相关的数据,自动计算用于布局的尺寸(包括最小值),用于预置自动计算相关的值机会被传递给 saveMeasurements() 方法,计算出最终布局尺寸。组件根据需要调整子对象的坐标与尺寸等。

    a、请注意:这里的 draw() 并不是真正的渲染对象,而只是表示对绘制时的数据处理,决定需要重绘的属性,真正的绘制过程是下面的 render() 方法对应的渲染过程。

    b、在创建自定义组件的时候,draw() 方法既简单,又有用,通过它就能完成验证步骤。

    c、在 draw() 方法中,调用 isInvalid() 方法可以判断某个属性是否失效的,是否需要重绘的(如果调用 isInvalid() 方法时没有传入失效类型参数,那么任意的一个失效标志(flags)都会返回 true)。

    d、如果没有手动设置组件的宽与高,在验证步骤中,saveMeasurements() 方法就会被调用,根据子组件、皮肤、样式布局等设置,来自动计算组件的尺寸。

    e、isQuickHitAreaEnabled 属性它有点类似于传统显示对象中的 mouseChildren 属性,它可以大大提高点击碰撞测试的性能(touch hit tests),如果子组件不需要碰撞检测,可以用它来优化性能。它会将碰撞检测简化为对一个 actualWidth 与 actualHeight 的矩形(自动计算出来的)碰撞检测。

    f、Feathers 组件 width 与 height 属性的设置与读取取决于多个因素,这两个值在通过 setter 方法设置时内部对应的是私有的 _explicitWidth 与 _explicitHeight 属性值,当手动设置的时候,就会更改 _explicitWidth 与 _explicitHeight 属性,再通过 getters 方法返回的也就是对应的 _explicitWidth 与 _explicitHeight 属性值;只读属性 explicitWidth 与 explicitHeight 也会暴露“ _explicit”私有值,explicitWidth 与 explicitHeight 两个值也是用于布局的值。如果没有手动设置 width 与 height 属性,那么就会被自动计算出来,最终结果会被传递给 saveMeasurements() 方法。

    5、渲染(Render)

    Feathers 显示相关的组件都是 Starling 显示对象,所以它有一个 render() 方法,Starling 会在每一帧调用这个方法(Feathers 组件通常不会覆盖 Starling 的 render() 方法),在组件 render()方法被调用前,总是会执行验证步骤。

    6、失效 (Invalidation)

    接下来,当组件的属性出现变化时,组件需要将对应属性失效的类型参数(一个或多个)传递给 invalidate() 方法,通常它在一个 setter 方法体内,失效的类型参数可以是代表尺寸、布局、选择状态的等等。每个组件可能会有一些自己独特的失效类型参数,但一些常用的失效类型参数已经作为常量被定义在 FeathersControl 这个基类上了。失效类型参数如何使用没有任何强制规则,可以随意调用 invalidate() 方法不传入任何参数。

    在组件“失效”后,组件就会进入等待“验证”的步骤(此时也可以手动强制执行 validate() 方法进入验证步骤,比如想立即得到组件的宽与高值,这些值是在验证步骤中计算的) ,在到达渲染步骤前,属性可能再次发生改变或其它属性也可能发生改变。当组件进入渲染步骤的时候,会确保所有属性更改已提交(committed)到渲染的需求。

    失效→验证→渲染,这个循环的过程会一直进行,直到组件从显示列表被移除,它才会停止;如果再次被添加到显示列表,这个过程就会又继续。

    7、移除 (Removal)

    组件从显示列表被移除后,就不会再自动进入验证步骤,所有属性的更改会被保存,但不会再被提交(committed)到渲染的需求里。除非它再次被添加到显示列表,才会重新开始进入验证步骤。如果组件不在显示列表上(不在舞台上),也想让组件也进入“验证”步骤,需要手动调用组件的 validate() 方法。

    8、销毁(Disposal)

    与 Starling 显示对象一样,Feathers 的组件也有 dispose() 方法,用来移除事件侦听器、纹理、子对象等。一个组件被销毁后自然就不能再进行验证了。被调用 dispose() 方法不应该是被添加在显示列表上的对象(需要先将它从显示列表移除),否则就可能产生运行时异常或失去所有响应。

    9、垃圾回收(Garbage Collection)

    当组件的所有引用被去除的时候,它就适合被垃圾回收器回收了(垃圾回收器的回收工作是不可控制的)。

    • Tags:
    • 2017 / 1 / 22
    相关文章:
      Post Comment.

      发表评论