当前位置: 首页 > news >正文

微信小程序- 用canvas生成排行榜

设计功能不是很复杂,也不想用插件,最终出现现在版本,主要用到微信小程序 wx.canvasToTempFilePath方法

// 直接调用改方法
createQRCode() {const qrCodeCanvasId = "qrcodeCanvas";drawQrcode({width: 200,height: 200,canvasId: "qrcodeCanvas",text: `https://www.dabanban.cn/face?rotateId=${this.data.rotateId}`,});setTimeout(() => {this.convertCanvasToImage(qrCodeCanvasId);}, 500);},//把 Canvas 转换成图片convertCanvasToImage(canvasId) {wx.canvasToTempFilePath({canvasId: canvasId,success: (res) => {// 传给 painter 组件绘制this.generatePoster(res.tempFilePath);},fail: (err) => {console.error("canvas 转图片失败:", err);},});},generatePoster(qrCodeUrl) {const { rankList, maleIcon, femaleIcon, rotateInfo } = this.data;const bgColors = ["#FFECEC", "#EAF4FF", "#FFF8E1", "#F1F1F1"];const spacing = 20;const baseTop = 750;const defaultAvatar = '/images/default-avatar.png'; // 添加默认头像路径// 计算每个排名项的基础高度const getItemHeight = (playerCount) => 80 + (60 * playerCount);// 计算垂直偏移量const getVerticalOffset = (index, prevPlayersCount) => {let totalHeight = 0;for (let i = 0; i < index; i++) {const players = Array.isArray(rankList[i].user) ? rankList[i].user : [rankList[i]];totalHeight += getItemHeight(players.length) + spacing;}return baseTop + totalHeight;};const views = [// 标题{type: "text",text: "看看",css: {top: "40rpx",left: "50%",fontSize: "40rpx",align: "center",color: "#333",fontWeight: "bold",},},// 排行榜背景{type: "image",url: "https://www.dabanban.cn/resource/dabanban/miniImages/rank.png",css: {width: "628rpx",height: "442rpx",top: "132rpx",left: "50%",align: "center",},},// 轮转比赛背景框{type: "rect",css: {width: "668rpx",height: "280rpx",top: "450rpx",left: "50%",align: "center",borderRadius: "20rpx",color: "#FFFFFF",borderWidth: "2rpx",borderColor: "#E0E0E0",},},// 轮转比赛标题{type: "text",text: rotateInfo.title,css: {top: "483rpx",left: "72rpx",fontSize: "30rpx",color: "#333",fontWeight: "bold",maxLines: 1,ellipsis: true,},},// 几队{type: "text",text: `${rotateInfo.totalNum}队`,css: {top: "547rpx",left: "72rpx",fontSize: "26rpx",color: "#666",maxLines: 1,ellipsis: true,},},// 多少人轮转{type: "text",text: `${rotateInfo.rotateTypeName}`,css: {top: "547rpx",left: "120rpx",fontSize: "26rpx",color: "#666",maxLines: 1,ellipsis: true,},},// 多少分制{type: "text",text: `${rotateInfo.scoreRule}分制`,css: {top: "547rpx",left: "350rpx",fontSize: "26rpx",color: "#666",},},// 表头背景{type: "rect",css: {width: "668rpx",height: "100rpx",left: "50%",top: "650rpx",align: "center",borderRadius: "10rpx",color: "#F0F0F0",},},// 表头文本{type: "text",text: "排名",css: {top: "685rpx",left: `80rpx`,fontSize: "26rpx",color: "#666",fontWeight: "bold",},},{type: "text",text: "参赛选手",css: {top: "685rpx",left: `200rpx`,fontSize: "26rpx",color: "#666",fontWeight: "bold",},},{type: "text",text: "胜-负",css: {top: "685rpx",left: `485rpx`,fontSize: "26rpx",color: "#666",fontWeight: "bold",},},{type: "text",text: "净胜分",css: {top: "685rpx",left: `600rpx`,fontSize: "26rpx",color: "#666",fontWeight: "bold",},},];// 动态生成选手排名rankList.forEach((player, index) => {const players = Array.isArray(player.user) ? player.user : [player];const playerCount = players.length;const itemHeight = getItemHeight(playerCount);const itemTop = getVerticalOffset(index, playerCount);// 排名项背景views.push({type: "rect",css: {width: "668rpx",height: `${itemHeight}rpx`,left: "50%",top: `${itemTop}rpx`,align: "center",borderRadius: "10rpx",color: bgColors[index] || "#F1F1F1",}});// 排名数字views.push({type: "text",text: `${index + 1}`,css: {top: `${itemTop + itemHeight/2 - 15}rpx`, // 垂直居中left: "70rpx",fontSize: "30rpx",color: "#121212",fontWeight: "bold",width: "50rpx",textAlign: "center",}});// 每个玩家的信息players.forEach((p, i) => {const playerTop = itemTop + 25 + (i * 80);// 头像views.push({type: "image",url: p.imgUrl || defaultAvatar,css: {width: "60rpx",height: "60rpx",top: `${playerTop}rpx`,left: "170rpx",borderRadius: "30rpx",}});// 性别图标views.push({type: "image",url: p.gender === 1 ? femaleIcon : maleIcon,css: {width: "30rpx",height: "30rpx",top: `${playerTop + 15}rpx`,left: "240rpx",}});// 玩家昵称views.push({type: "text",text: p.nickName || "匿名玩家",css: {top: `${playerTop + 10}rpx`,left: "280rpx",fontSize: "28rpx",color: "#121212",maxLines: 1,ellipsis: true,width: "180rpx",}});});// 胜负记录和净胜分(显示在第一个玩家行)views.push({type: "text",text: `${player.successNum || 0}-${player.failNum || 0}`,css: {top: `${itemTop + itemHeight/2 - 15}rpx`,left: "490rpx",fontSize: "30rpx",color: "#121212",fontWeight: "bold",}},{type: "text",text: `${player.score || 0}`,css: {top: `${itemTop + itemHeight/2 - 15}rpx`,left: "590rpx",fontSize: "30rpx",color: "#121212",width: "100rpx",textAlign: "center",}});});// 计算二维码位置const qrTop = getVerticalOffset(rankList.length, 0) + 50;views.push({type: "text",text: "长按扫码查看详情",css: {top: `${qrTop - 30}rpx`,left: "50%",fontSize: "22rpx",color: "#333",fontWeight: "bold",align: "center",},},{type: "image",url: qrCodeUrl,css: {width: "150rpx",height: "150rpx",top: `${qrTop + 20}rpx`,left: "50%",align: "center",},},{type: "text",text: "—0ne 看看—",css: {top: `${qrTop + 190}rpx`,left: "50%",fontSize: "26rpx",color: "#333",fontWeight: "bold",align: "center",},});this.setData({posterData: {width: "750rpx",height: `${qrTop + 280}rpx`,background: "#F8F9FB",pixelRatio: 2,views,},});},

生成后的效果:

http://www.lqws.cn/news/170353.html

相关文章:

  • 本地部署Qwen3
  • ComfyUI 中如何使用 Depth ControlNet SD1.5
  • 基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
  • 27.【新型数据架构】-数据共享架构
  • 如何让其他品牌更难转化走我们的用户?
  • 从0到1写一个适用于Node.js的User Agent生成库
  • GWO-LSSVM-Adaboost灰狼算法GWO优化最小二乘支持向量机LSSVM分类预测!
  • AI如何改变IT行业
  • Python备忘
  • ES6——数组扩展之Set数组
  • onSaveInstanceState() 和 ViewModel 在数据保存能力差异
  • ES6——对象扩展之Set对象
  • 详细介绍uni-app中Composition API和Options API的使用方法
  • uniapp Vue2 获取电量的独家方法:绕过官方插件限制
  • uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
  • 深度学习环境配置指南:基于Anaconda与PyCharm的全流程操作
  • 前端面试题之ES6保姆级教程
  • Vue3 + UniApp 蓝牙连接与数据发送(稳定版)
  • 【Python 算法零基础 4.排序 ⑪ 十大排序算法总结】
  • 学习笔记(26):线性代数-张量的降维求和,简单示例
  • uniapp+vue2解构赋值和直接赋值的优缺点
  • 如何利用 Redis 实现跨多个无状态服务实例的会话共享?
  • 传统业务对接AI-AI编程框架-Rasa的业务应用实战(4)--Rasa成型可用 针对业务配置rasa并训练和部署
  • AI代码助手需求说明书架构
  • 408第一季 - 数据结构 - 数组和特殊矩阵
  • 贝叶斯网络_TomatoSCI分析日记
  • 探索 Java 垃圾收集:对象存活判定、回收流程与内存策略
  • 如何理解OSI七层模型和TCP/IP四层模型?HTTP作为如何保存用户状态?多服务器节点下 Session方案怎么做
  • Docker部署Hive大数据组件
  • JAVA学习 DAY2 java程序运行、注意事项、转义字符