守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1125|回复: 0

[组件制作] Flex List组件(dataGroup )细谈

[复制链接]
  • TA的每日心情
    无聊
    2016-4-19 18:18
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    8

    主题

    15

    帖子

    1705

    积分

    版主

    Rank: 16Rank: 16Rank: 16Rank: 16

    威望
    8
    贡献
    1
    金币
    808
    钢镚
    29

    开源英雄

    发表于 2015-1-20 12:04:57 | 显示全部楼层 |阅读模式
    在群里  ( !非常实验室! 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个属性中的某一个已经改动了, 此时即可获取它们的值, 你可以用这个来做列表的边滚动, 边加载视域窗口内项目呈现器里的图片, 以做到节省内存, 网络通讯量 和 优化性能 的目的.



    评分

    参与人数 1金币 +8 收起 理由
    破晓 + 8 赞一个!

    查看全部评分

    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-18 22:48 , Processed in 0.047544 second(s), 35 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表