在微信小游戏中,好友排名数据是能在关系数据域操作,整个关系数据域只会返回一个最终的sharedCanvas,并且这个canvas不能调用toDataURL()方法,所以要展示好友排行榜的话只能在关系数据域中将信息画在sharedCanvas上面。对于排名信息的分页,比较常见的做法是加一个上一页下一页按钮。例如好友数据共有500条,默认为第0页,一页展示10条的话,就将0-9条数据画到排行榜页面上。点击按钮的时候重新设置当前是第几页,再重新绘制10条数据。

  有上一页下一页按钮的分页做法比较简单,容易实现,但是一个页面没来空间就小,还要加上两个按钮,很容易导致一页只能显示五六条数据,这样不停的点击按钮翻页很麻烦。所以如果可以直接一页内滑动查看所有排名信息的话,用户体验会比较好。下面就具体说明一下,怎么实现滑动查看所有排名。

  需要实现的功能:一个canvas区域中部分区域滚动无限加载。

  首先实现逻辑思考:一整个canvas页面大小720*1280,中间一块区域是显示排行信息的,这里假设大小是650*600,要在这个650*600的区域实现滑动查看500条数据,滑动过程这个区域之外的地方canvas内容不变,类似于中间一块区域为一个滚动区域,其他区域不受影响,排名信息渲染在滚动区域中,超出的部分隐藏。

  初步实现打算:设定一个变量baseTop表示滚动了多少px的距离,默认值为0,每条排名信息有个高度itemHeight,每条信息上下有个间距marginTop。这里设置itemHeight为120px,marginTop为10px;遍历排名数据,第i条排名数据的位置为(1280-600)/2 + (10 + 120) * i + baseTop。绘制好排名信息之后,使用context.clearRect(x,y,width,height)方法,执行context.clearRect(0,0,720,(1280-600)/2) 和 context.clearRect(0,(1280+600)/2,720,1280 - (1280+600)/2)将中间650*600区域之外的排名信息擦除,再绘制排名信息之外的内容。再只需要根据滑动事件改变baseTop的值,再重新渲染canvas,就可以实现canvas上部分区域滑动查看更多排名信息了。

  实现过程步骤:根据滚动距离绘制所有排名信息 =》擦除溢出到可滚动区域之外的内容 =》绘制除排名信息之外的内容 =》滑动过程改变滚动距离 =》 回到第一步重新渲染。

  初步实现过程:以egret引擎为例,给排行榜页面添加touchBegin,touchEnd,touchMove事件。定义4个变量rankCanMove,rankTouchId,rankTouching,rankTouchOldPos。分别表示触摸区域是否为滚动区域,触摸事件的id,触摸事件是否正常进行,上一个触摸点的位置。用这4个变量控制多指触摸的话,只有第一个触摸点有效。触摸点只有在需要滚动的区域内才有效。将滑动过程中新的触摸点与旧的触摸点的Y轴移动距离算出来,通过openDataContext.postMessage将移动的Y轴距离传到关系数据域,关系数据域收到信息重新设置baseTop的值,再重新渲染。三个触摸事件的代码如下:

至此基本功能已实现,但是由于在触摸滑动过程不停的重新渲染所有排名数据,再擦除,再渲染排名之外的信息。当排名数据越多时,性能会越差。于是想着,能不能实现类似于懒加载的懒渲染,只渲染需要显示的数据。例如总共1000条排名的话,同时看到的可能只有6条,现在会渲染1000条再擦除,实现目标只渲染需要的6条再擦除超出部分。

需要实现的功能:一个canvas区域中部分区域滚动无限加载的基础上,实现懒渲染。

实现逻辑思考:可以根据baseTop判断需要显示的数据为哪6条和判断这六条的位置应该是怎么样的。只遍历需要的6条数据,在正确的位置渲染。再擦除超出部位,再渲染排名之外的信息。

实现过程步骤:根据滚动距离确定可见的数据是哪几条=》根据滚动距离绘制这几条数据的排名信息 =》擦除溢出到可滚动区域之外的内容 =》绘制除排名信息之外的内容 =》滑动过程改变滚动距离 =》 回到第一步重新渲染。

实现过程:baseTop初始是0,每滑动一条信息就上移(减少)了120px+10px距离。当前要展示的6条数据为所有数据数组arr.slice(0-Math.ceil(baseTop/130),6-Math.ceil(baseTop/130)。因为baseTop小与0,所以用Math.ceil。遍历渲染这六条数据的位置为(1280-600)/2 + baseTop % 130 + i * 130;

到这里就实现了关系数据域整个canvas区域中部分区域滚动无限加载并且懒渲染了。

微信小游戏排行榜页滚动查看排行榜(canvas指定区域溢出滚动,懒渲染)的更多相关文章

  1. 使用Laya引擎开发微信小游戏(上)

    本文由云+社区发表 使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏. 作者:马晓东,腾讯前端高级工程师. 微信小游戏的推出也快一年时间了,在IEG的游戏运营活动中,也出现 ...

  2. Egret5.2.2 微信小游戏行的示例排行榜

    Egret5.2.2版本发布微信小游戏后,在开放数据域有一个默认排行榜.这个文件夹代码+图大小就22kb. 排行榜的效果就是示范用的,很丑...带翻页. 代码如下,基本就是使用canvas渲染了一个排 ...

  3. cocosCreator微信小游戏排行榜思路

    cocosCreator制作微信小游戏排行榜实现方案: 游戏认知:项目分为主域和子域,主域就是游戏主程部分,子域为单独处理微信排行榜公共域数据的. 游戏主域里创建一个节点,添加WXSubContext ...

  4. Egret白鹭开发微信小游戏排行榜功能

    推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 我的个人博客 最近事情特别多,今天终于实现了排行榜功能,记录下来大家一起学习学习. 一.调用默认排行榜 首先我们需要了解: 1.白鹭开 ...

  5. 【转】Fundebug上线微信小游戏错误监控!支持自动截屏!

    摘要: Fundebug竭诚为你的小游戏保驾护航. 想必大家都玩过"跳一跳"吧?刷排行榜的感觉是不是很好啊!还有"知乎答题王"呢,在智力上碾压老铁简直太棒了! ...

  6. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  7. 微信小游戏egret开发包括p2引擎小结

    用egret + p2 做一个类似投球的小游戏,坑大致如下: 1.p2引擎与egret坐标不同注意转换,横坐标没什么,纵坐标egret.y = stageHeight - body.position[ ...

  8. 【转】微信小游戏接入Fundebug监控

    在SegmentFault上看到Fundebug上线小游戏监控,刚好最近开始玩微信小游戏,于是尝试接入试了一下. 接入方法 创建项目的时候选择左下角的微信小游戏图标. 点击继续进入接入插件页面. 第三 ...

  9. 【转】利用 three.js 开发微信小游戏的尝试

    前言 这是一次利用 three.js 开发微信小游戏的尝试,并不能算作是教程,只能算是一篇笔记吧. 微信 WeChat 6.6.1 开始引入了微信小游戏,初期上线了一批质量相当不错的小游戏.我在查阅各 ...

随机推荐

  1. Python爬虫连载2-reponse\parse简介

    一.reponse解析 urlopen的返回对象 (1)geturl:返回网页地址 (2)info:请求反馈对象的meta信息 (3)getcode:返回的http code from urllib ...

  2. 京东云数据库 RDS助力企业便捷运维

    iPhone6发布那年,京东在国贸等商圈送货最快速度数分钟,包括从下单到送达.这是一个极端的富含营销因素例子.即便如此,常态来看,隔天到货的这种业务模式,也是基于同样的支撑:营销业务.物流业务,大数据 ...

  3. C# 基础Array

    一.Array的作用 连续定义多个相同类型的变量,比如我定义1000个学生的学生年龄,int[] age = new int[1000];不需要慢慢的一个一个变量的定义,数组是不是很方便. 需要注意的 ...

  4. c# 之循环 ,while 和do---while还有for

    ㈠while循环 循环条件 是个bool值,为true时执行循环,为false退出循环.break一般不单独的使用,而是跟着if判断一起使用,表示,当满足某些条件的时候,就退出循环了. 循环体 一般总 ...

  5. 阿里云Linux格式化数据盘,分区并挂载一个文件系统

    阿里云一块全新的数据盘挂载到ECS实例后,您必须创建并挂载至少一个文件系统.本示例使用I/O优化实例,操作系统为CentOS 7.6,为一块新的300GiB数据盘(设备名为/dev/vdb)创建一个M ...

  6. 小白学习之pytorch框架(5)-多层感知机(MLP)-(tensor、variable、计算图、ReLU()、sigmoid()、tanh())

    先记录一下一开始学习torch时未曾记录(也未好好弄懂哈)导致又忘记了的tensor.variable.计算图 计算图 计算图直白的来说,就是数学公式(也叫模型)用图表示,这个图即计算图.借用 htt ...

  7. leetcode腾讯精选练习之除自身以外数组的乘积(十)

    最长公共前缀 题目 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. ...

  8. 吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--测试

    import sys import codecs import tensorflow as tf # 1.参数设置. # 读取checkpoint的路径.9000表示是训练程序在第9000步保存的ch ...

  9. linux4.11内核设备编译时出现的问题(参考博客并更改的)

    AllWinnerH3 linux4.11版本的bsp下载: https://pan.baidu.com/s/1mhU4a8K 密码: b375 H3-linux4.11_bsp目录就是所需的源码及编 ...

  10. jsonConfig用法

    1.先编写jsonConfig的初始化代码 private JsonConfig jsonConfig; public action构造方法() { jsonConfig = new JsonConf ...