- 积分
- 1886
- 注册时间
- 2014-12-29
- 最后登录
- 2016-6-17
- 在线时间
- 14 小时
- 威望
- 8
- 贡献
- 1
- 金币
- 989
- 钢镚
- 29
- 交易凭证
- 0
- 分享
- 0
- 精华
- 1
- 帖子
- 15
- 主题
- 8
TA的每日心情 | 无聊 2016-4-19 18:18 |
---|
签到天数: 10 天 [LV.3]偶尔看看II
版主
- 威望
- 8
- 贡献
- 1
- 金币
- 989
- 钢镚
- 29
|
在群里 ( !非常实验室! 23477140) 看到大牛们讨论List底层的东西,感觉受益匪浅,简单整理如下:
较低层的就是 List 组件的设计原理, 它是依赖 DataGroup 作为自己的 SkinPart 的, DataGroup 负责填充数据, 渲染列表, List 相当于是 DataGroup 的控制层。可以通过 list.dataGroup 得到 DataGroup 的类实例, 说几个可以用到的, 但无需全部用到:
1.比如监听 list.dataGroup.dataProvider 的 CollectionEvent.COLLECTION_CHANGE 事件, 发生这个事件就证明数据源被修改了, 你可以通
过 CollectionEvent 类的属性知道是增加, 更新, 还是删除了数据, 这个便于做数据层上的控制, 注意, 这个事件发生后, 显示层并不会立即更新 渲染, 也就是说数据会被先处理, 显示层的处理在后面。
2.关于显示层的更新, 可以听 list.dataGroup 的 RendererExistenceEvent.RENDERER_ADD 和 RendererExistenceEvent.RENDERER_REMOVE, 这2 个事件分别代表, 新的项目呈现器已经添加到显示列表并已渲染, 以及某个项目呈现器已从显示列表移除。
比如可以在 RendererExistenceEvent.RENDERER_ADD 的监视器方法里, 判断新增的这个项目呈现器是不是位于列表末尾, 如果是的话, 调 用 list.dataGroup.verticalScrollPosition = 自定义一个数值, 以手动调整滚动条的位置。
3.要判断 DataGroup 是否完全更新完毕, 可以监听 FlexEvent.UPDATE_COMPLETE, 在这个监视器里,
判断dataGroup.numElements == dataGroup.numChildren 是否为 true, 如果是则表示更新完毕, 这个时候也可
以去手动控制 dataGroup.verticalScrollPosition 属性的值。
4.dataGroup.numElements 和 dataGroup.dataProvider.length 是一致的, 代表数据源里有多少个数据项,而 dataGroup.numChildren 代表当前在显示列表 上的项目呈现器数量, 如果 dataGroup 正在更新显示列表, 则 dataGroup.numElements 和 dataGroup.numChildren 可能不相等。
总之, 真正的 视域 是 DataGroup, 不是 List 也不是 Scroller, DataGroup.horizontalScrollPosition 和 DataGroup.verticalScrollPosition 来控制 DataGroup 这个 视域窗口 的滚动位置, 用户看到的是通过这个 视域窗口 里的 DataGroup 内容
5.DataGroup.horizontalScrollPosition 和 DataGroup.verticalScrollPosition 这2个属性的实现是由 DataGroup.layout 对应的布局类实例代理的, 那个布局类事例最终就是控制 DataGroup.scrollRect 这个 Flash 最底层的滚动视域属性来实现滚动的。
6.如果想要在 DataGroup 的外部实时监听 DataGroup 的 horizontalScrollPosition 和 verticalScrollPosition 的改动, 则监
听 DataGroup 的 PropertyChangeEvent.PROPERTY_CHANGE 事件, 监视器方法里
判断 event.property == "horizontalScrollPosition" || event.property == "verticalScrollPosition", 如果满足, 则意味着这2个属性中的某一个已经改动了, 此时即可获取它们的值, 你可以用这个来做列表的边滚动, 边加载视域窗口内项目呈现器里的图片, 以做到节省内存, 网络通讯量 和 优化性能 的目的.
|
评分
-
查看全部评分
|