| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // Learn cc.Class:
- // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/class.html
- // - [English] http://www.cocos2d-x.org/docs/creator/en/scripting/class.html
- // Learn Attribute:
- // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html
- // - [English] http://www.cocos2d-x.org/docs/creator/en/scripting/reference/attributes.html
- // Learn life-cycle callbacks:
- // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html
- // - [English] http://www.cocos2d-x.org/docs/creator/en/scripting/life-cycle-callbacks.html
- cc.Class({
- extends: cc.Component,
- properties: {
- // foo: {
- // // ATTRIBUTES:
- // default: null, // The default value will be used only when the component attaching
- // // to a node for the first time
- // type: cc.SpriteFrame, // optional, default is typeof default
- // serializable: true, // optional, default is true
- // },
- // bar: {
- // get () {
- // return this._bar;
- // },
- // set (value) {
- // this._bar = value;
- // }
- // },
- item: cc.Prefab,
- content: cc.Node,
- scrollView: cc.Node,
- maskNode: cc.Node
- },
- // LIFE-CYCLE CALLBACKS:
- // onLoad () {},
- start() {
- this.scrollview = this.node.getChildByName("scrollview")
- this.view = this.scrollview.getChildByName("view")
- this.more = this.view.getChildByName("more")
- this.morett = this.more.getComponent(cc.Label)
- this.scrollView.on('scroll-to-bottom', function () {
- cc.log('滚动到列表底部了');
- // this.morett.string = "松手加载更多"
- if (this.onMoreListener) {
- this.onMoreListener()
- }
- }.bind(this));
- this.scrollView.on('scrolling', function (event) {
- cc.log('正在滚动',this.content.y,"高",this.content.height,"原本的高度",
- this.oldY,"计算的高度",this.content.y+this.oldY);
- if ( this.content.y+this.oldY >= this.content.height*0.98) {
- cc.log('现在要显示哦');
- if (this.more.active == false) {
- this.more.active = true
- // this.morett.string = "上拉加载更多"
- }
- }else{
- this.more.active = false
- }
- }.bind(this));
- },
- onMoreListener(){
- },
- setMoreListener(onMoreListener){
- this.onMoreListener = onMoreListener
- },
- createList(data) {
- this.data = data;
- this.itemHeight = 110;//设置每个item的高
- this.topIndex = 0;//最上面的item索引id
- this.bottomIndex = 9;//最下面的item索引id
- this.offsetY = 200;//上下临界坐标补充,点击查看原理,值太小会出现item在边界闪动的情况,因为item可能此时在上下两边时均符合移动的情况,所以就会无限循环移动,此值建议自行调整
- //如果觉得这种获取临界坐标的方式比较麻烦,可以多创建几个item,指定屏幕的上下边为边界
- let scrollViewPos = this.scrollView.position;//scrollView以屏幕中心为原点的坐标,请自行计算出来
- this.topExtremeDistance = scrollViewPos.y + this.scrollView.height / 2 + this.offsetY;//获取item能到达的屏幕上边界y坐标
- this.bottomExtremeDistance = scrollViewPos.y - this.scrollView.height / 2 - this.offsetY;//获取item能到达的屏幕下边界y坐标
- this.itemsArr = [];//item存储arr
- for (let i = 0; i < this.data.length; i++) {
- let listItem = cc.instantiate(this.item);
- listItem.parent = this.content;
- this.updateItem(listItem, this.data[i], i);
- }
- this.oldY = this.content.y
- this.content.height = (data.length ) * this.itemHeight + 50;
- },
- moreItem(data){
- var oldindex = this.data.length
- this.data = this.data.concat(data);
- cc.log('加载更多 data i',this.data);
- // cc.log('加载更多 data',this.data);
- // for (let i = oldindex; i < this.data.length; i++) {
- // let listItem = cc.instantiate(this.item);
- // listItem.parent = this.content;
- // this.updateItem(listItem, this.data[i], i);
- // }
- //
- this.oldY = this.content.y
- this.content.height = (oldindex ) * this.itemHeight + 50;
- },
- updateItem(listItem, data, i) {
- listItem.y = -i * this.itemHeight - this.itemHeight / 2;
- listItem.getComponent('SVItem').updateUI(data);
- this.itemsArr[i] = listItem;
- },
- updateItemsPos(dt) {
- if (!!this.itemsArr && !!this.itemsArr[this.bottomIndex]) {
- //获取上下item当前的坐标
- // let topPos = cc.pSub(this.itemsArr[this.topIndex].convertToWorldSpaceAR(cc.v2(0, 0)), cc.v2(cc.winSize.width / 2, cc.winSize.height / 2));
- // let bottomPos = cc.pSub(this.itemsArr[this.bottomIndex].convertToWorldSpaceAR(cc.v2(0, 0)), cc.v2(cc.winSize.width / 2, cc.winSize.height / 2));
- let topPos = this.itemsArr[this.topIndex].convertToWorldSpaceAR(cc.v2(0, 0)).sub(cc.v2(cc.winSize.width / 2, cc.winSize.height / 2))
- let bottomPos = this.itemsArr[this.bottomIndex].convertToWorldSpaceAR(cc.v2(0, 0)).sub(cc.v2(cc.winSize.width / 2, cc.winSize.height / 2))
- //检测上item是否超过边界
- if (topPos.y > this.topExtremeDistance) {
- if (this.bottomIndex >= this.data.length - 1) {
- return;
- }
- this.updateItem(this.itemsArr[this.topIndex], this.data[this.bottomIndex + 1], this.bottomIndex + 1);
- this.topIndex++;
- this.bottomIndex++;
- //检测下item是否超过边界
- } else if (bottomPos.y < this.bottomExtremeDistance) {
- if (this.topIndex < 1) {
- return;
- }
- this.updateItem(this.itemsArr[this.bottomIndex], this.data[this.topIndex - 1], this.topIndex - 1);
- this.topIndex--;
- this.bottomIndex--;
- }
- }
- },
- onBtnClk: function (event, param) {
- switch (param) {
- case 'back':
- this.node.destroy();
- break;
- case 'mask':
- this.maskNode.getComponent(cc.Mask).enabled = !this.maskNode.getComponent(cc.Mask).enabled;
- break;
- }
- },
- update(dt) {
- this.updateItemsPos(dt);
- },
- });
|