zoukankan      html  css  js  c++  java
  • cocos creator基础-(二十二)滚动列表高级使用 动态加载数据

    动态加载列表

    1: 每个记录是滚动列表里面的一个项,我们将整个列表分为3页,每页固定的项的数目;
    2: 一个PAGE的项最好超过滚动列表的大小;
    3: 课程案例, 创建一个滚动列表, 每一个page为一个页,共3个页,每个page有8个项;
    3 * 8 = 24个项, 用1-100来模拟数据记录;
    4: 编写代码往滚动列表里面加入所需要的项目;

    往下加载示意图


    auto scroll细节

    1: auto scroll有自己的控制content的位置的机制,
      会导致content的位置与我们加载时候的位置修改冲突,体现在快速滚动后的连续加载;
    2: 处理细节:
      (1)在判断要加载的时候,先判断当前是否在auto scroll模式, 如果是返回;
      (2)监听autosocroll结束后抛出的end事件,在来计算加载;
      (3) 当auto scroll滚动到最上头的时候,会有回弹,那个时候发生了加载,所以
        在要加载的时候,检测到时autoscroll,关闭掉回弹的效果,等auto scroll end事件发生了以后再打开;
        this.scroll_view.elastic = false;
        this.scroll_view._autoScrolling

    /*
    假设世界排行榜要100个玩家的数据,我们怎么使用滚动列表来实现?
    显示[1, 100]这个数据
    (1)我们将我们滚动列表里面的每个项分成三个页
    (2)每一个页面我们制定一个数目,例如8个,根据你的scrollview的大小来决定;
    (3)总共使用的滚动列表里面的想 PAGE_NUM * 3 = 24个;
    (4) 有限的项要显示 超过它数目的数据记录?
    
    */
    
    cc.Class({
        extends: cc.Component,
    
        properties: {
            // foo: {
            //    default: null,      // The default value will be used only when the component attaching
            //                           to a node for the first time
            //    url: cc.Texture2D,  // optional, default is typeof default
            //    serializable: true, // optional, default is true
            //    visible: true,      // optional, default is true
            //    displayName: 'Foo', // optional
            //    readonly: false,    // optional, default is false
            // },
            // ...
            OPT_HEIGHT: 80, // 每项的高度
            PAGE_NUM: 8, // 每页为8个;
            item_prefab: {
                type: cc.Prefab,
                default: null,
            },
    
            scroll_view: {
                type: cc.ScrollView,
                default: null,
            },
        },
    
        // use this for initialization
        onLoad: function () {
            this.value_set = [];
            // 如果你这里是排行榜,那么你就push排行榜的数据;
            for(var i = 1; i <= 100; i ++) {
                this.value_set.push(i);
            }
    
            this.content = this.scroll_view.content;
            this.opt_item_set = [];
            for(var i = 0; i < this.PAGE_NUM * 3; i ++) {
                var item = cc.instantiate(this.item_prefab);
                this.content.addChild(item);
                this.opt_item_set.push(item);
            }
    
            this.scroll_view.node.on("scroll-ended", this.on_scroll_ended.bind(this), this);
        },
    
        start: function() {
            this.start_y = this.content.y;
            this.start_index = 0; // 当前我们24个Item加载的 100项数据里面的起始数据记录的索引;
            this.load_record(this.start_index);
        },
    
        // 从这个索引开始,加载数据记录到我们的滚动列表里面的选项
        load_record: function(start_index) {
            this.start_index = start_index;
    
            for(var i = 0; i < this.PAGE_NUM * 3; i ++) {
                var label = this.opt_item_set[i].getChildByName("src").getComponent(cc.Label);
                // 显示我们的记录;
                label.string = this.value_set[start_index + i];
            }
        },
    
        on_scroll_ended: function() {
            this.scrollveiw_load_recode();
            this.scroll_view.elastic = true;
        },
    
        scrollveiw_load_recode: function() {
             // 向下加载了
            if (this.start_index + this.PAGE_NUM * 3 < this.value_set.length &&
                this.content.y >= this.start_y + this.PAGE_NUM * 2 * this.OPT_HEIGHT) { // 动态加载
                
                if (this.scroll_view._autoScrolling) { // 等待这个自动滚动结束以后再做加载
                    this.scroll_view.elastic = false; // 暂时关闭回弹效果
                    return;
                }
    
                var down_loaded = this.PAGE_NUM;
                this.start_index += down_loaded;
                if (this.start_index + this.PAGE_NUM * 3 > this.value_set.length) {
                    var out_len = this.start_index + this.PAGE_NUM * 3 - this.value_set.length;
                    down_loaded -= (out_len);
                    this.start_index -= (out_len);
                }
                this.load_record(this.start_index);
    
                this.content.y -= (down_loaded * this.OPT_HEIGHT);
                return;
            }
    
            // 向上加载
            if (this.start_index > 0 && this.content.y <= this.start_y) {
                if (this.scroll_view._autoScrolling) { // 等待这个自动滚动结束以后再做加载
                    this.scroll_view.elastic = false;
                    return;
                }
    
                var up_loaded = this.PAGE_NUM;
                this.start_index -= up_loaded;
                if (this.start_index < 0) {
                    up_loaded += this.start_index;
                    this.start_index = 0; 
                }
                this.load_record(this.start_index);
                this.content.y += (up_loaded * this.OPT_HEIGHT);
            }
            // end 
        },
        // called every frame, uncomment this function to activate update callback
        update: function (dt) {
            this.scrollveiw_load_recode();
        },
    });
  • 相关阅读:
    关于JDK中的设计模式
    关于Java中的构造方法和set方法()给属性赋值
    关于Object[]数组强转成Integer[]类型的数组.
    [ImportNew]Java中的Timer类和TimerTask类
    关于Linux最基本总结
    关于数组
    关于Linux系统和Windows系统中文件夹的命名规范
    关于数组集合之间的转换
    关于Java获取系统信息
    关于Windows常用命令
  • 原文地址:https://www.cnblogs.com/orxx/p/10532010.html
Copyright © 2011-2022 走看看