在微信小游戏中,好友排名数据是能在关系数据域操作,整个关系数据域只会返回一个最终的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. navicat for mysql连接数据库报错1251

    使用Navicat for mysql 连接数据库,报如下错误 原因:数据库安装的是8.0版本,新的mysql采用了新的加密方式,导致连接失败 解决办法:数据库执行如下命令 改密码加密方式:用管理员身 ...

  2. jquery 第二节 Dom和jQuery的互相转换

    1.Dom转jQuery Dom对象: var v_dom = document.getElementById("name"); 转换: jQuery对象:    var v_jq ...

  3. idHttpServer接收类型

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. Spring使用Rabbitmq (简单使用)

    1.pom.xml jar包引用 <dependencies> <dependency> <groupId>org.springframework</grou ...

  5. 文件下载post请求,返回文件流转换zip,

    最近一个需求是批量下载文件,最后打包成zip包,post请求, 因为是文件流下载,所以在取后台数据的时候,要多传递一个[responseType: ‘blob’]这个参数 download() { t ...

  6. 洛谷 P1082 同余方程(exgcd)

    题目传送门 解题思路: 因为推导过程过于复杂,懒得写,所以题解传送门 AC代码: #include<iostream> #include<cstdio> using names ...

  7. dubbo的超时处理和配置覆盖

    提供者的设置方式 消费者的设置方式 配置原则 dubbo推荐在Provider上尽量多配置Consumer端属性: 1.作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数 ...

  8. 17.3.16---python内建函数

    内置函数,无需import,任何时候都可以直接被使用 1------ Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍 ...

  9. 日期控件 My97DatePicker WdatePicker 日期格式

    WdatePicker()只显示日期 WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})显示日期和时间 WdatePicker({dateFmt:'yyyy-MM ...

  10. 网络安全与CTF在线学习资源网站

    http://www.sec-wiki.com/skill/ 安全技能(里面渗透逆向编程都有介绍) http://blog.knownsec.com/Knownsec_RD_Checklist/ 知道 ...