自定义AS3UI组件--前言
更新日期:
背景
公司用了好多年的公共库变的很臃肿,效率低,代码重复,最后这个重构重写的任务安排到了我,用blog记录下对AS组件的思考.
基类需要解决的问题
对组件基类的思考:
基础组件——一个容器,AS3提供的最基本的容器是Sprite,还有一个虚基类DisplayObjectContainer,但是这是一个虚基类且不能接受鼠标事件,所以为了方便(我觉得程序员的东西就应该方便自己)直接继承Sprite,但是Sprite有一个比较尴尬的问题就是不能设置大小尺寸,这里用到scrollRect
属性来控制尺寸,scrollRect
属性可以裁剪视图并对视图做滚动处理,更多信息谷歌。
如何提高渲染效率
对于组件属性修改的响应,比较直接的想法就是,在修改的时候就做出响应并做响应的处理,但是这样做的话效率比较低,可能在同一帧中对同一属性或者方法中调用多次那么这段逻辑就要处理多次了。
这里使用AS中较高级的用法Render
事件,每一个显示对象都会监听到这个事件,在显示对象渲染之前这是处理逻辑的最后一次机会。每次需要DisplayObject
触发render
事时,都要调用一次stage.invalidate();
所以在渲染之前统一处理显示逻辑可以减少很多重复的代码,定义一个callLater
函数,所有需要延迟处理的逻辑调用这个函数,签名:
|
|
但是也有可能同一个函数call
被调用多次,所以做一个判断只需要对同一个函数执行一次,传递的参数为最后修改的,不过这个参数一般是全局定义的,这样执行的效率会高很多。
设置组件的尺寸
组件width
和height
属性要被重写get
方法:
如果没有设置过尺寸就返回所有可视的子视图占得大小,就是一个
for
循环,用所有子视图的坐标加宽高。
set
方法
设置尺寸的时候重新设置
scrollRect
属性,这个属性可以裁剪视图显示,然后延迟布局组件内部布局。
组件内部事件管理
组件内部也会有事件管理并抛出,所以内部事件也需要管理不然就会有内存泄露了,但是这些管理不应该由使用者去关心,在内部管理对使用者是透明的。
- 显示对象在添加到父容器的时候才启用内部事件的监听,一种是自己监听
addToStage
事件,但是这个事件也需要被管理, 在逻辑上会有一个死结,所以重新定义一个addToParent
函数,内部调用addEvents
,这个函数集中监听了内部事件,在被添加到父容器的时候就会监听内部的必要事件。 - 内部事件何时被移除。以往删除显示对象需要先判断显示对象的
parent
属性是否为null
再删除这个显示对象,自定义组件新增函数:
|
|
内部做一个判断可以减少很多重复的代码,并且可以通过clear
参数判断是否移除内部事件dispose
函数。
常用属性
enable
:是否禁用组件,禁用鼠标事件并且改变组件外观。tip
:鼠标提示,提示跟随鼠标在组件内部移动,涉及内部事件。heigth/width
:重写宽高,不要调用super.width/height=value
,否则组件在设置宽高的时候不见。displayWidth/Height
:组件的显示尺寸,就是看到的大小,宽高乘以缩放值就是显示大小。skin
:组件的皮肤。