首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信小程序|抽奖大转盘实战

微信小程序|抽奖大转盘实战

作者头像
算法与编程之美
发布于 2020-05-29 06:44:07
发布于 2020-05-29 06:44:07
6.1K00
代码可运行
举报
运行总次数:0
代码可运行

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

问题描述

在抽奖的应用或小程序中,大多会采用一种常见的大转盘抽奖方式,这种方式能直观展现出这个抽奖活动的形式和内容,且能直接吸引人参与。那么这个功能是如何实现的呢?

效果图:

解决方案

(1)首先要实现这个大转盘的样式设计,通过canvas画布和animation动画来实现。(这两个api的用法小编在前面的实战文章有过讲解,感兴趣可以去看一看。)

wxml代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<view>
         <view>
                   <view>
                            <view  animation="{{animationData}}" >
                                     <canvas  style="width: 300px; height: 300px;"  canvas-id="lotteryCanvas"></canvas>
                                     <view>
                                               <view wx:for="{{awardsList}}"  wx:key="unique" style="-webkit-transform:  rotate({{item.lineTurn}});transform:  rotate({{item.lineTurn}})"></view>
                                     </view>
                                     <view>
                                               <view wx:for="{{awardsList}}"  wx:key="unique">
                                                     <view style="-webkit-transform:  rotate({{item.turn}});transform:  rotate({{item.turn}})">{{item.award}}</view>
                                               </view>
                                     </view>
                            </view>
                            <view  bindtap="getLottery" class="canvas-btn  {{btnDisabled}}">抽奖</view>            
                   </view>
         </view>
</view>

(2)wxss中需要实现的则是几种不同颜色效果以及这个圆盘样式的效果。

这其中需要实现一个圆的效果,和圆上的平分六条分割线的样式。中间的抽奖样式,实际上是由下面一个圆上面一个三角形进行重合来展现的,当然,这里也可以直接换成一张类似抽奖样式的图片更方便。

部分代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//转盘

.canvas-container{

   margin: 0 auto;

   position: relative;

   width: 300px;

   height: 300px; 

   border-radius: 50%;

}

 

.canvas-content{

   position: absolute;

   left: 0;

   top: 0;

   z-index: 1;

   display: block;

   width: 300px;

   height: 300px;

   border-radius: inherit;

   background-clip: padding-box;

   background-color: #ffcb3f;

}

.canvas-element{

   position: relative;

   z-index: 1;

   width: inherit;

   height: inherit;

   border-radius: 50%;

}

.canvas-list{

   position: absolute;

   left: 0;

   top: 0;

   width: inherit;

   height: inherit;

   z-index: 9999;

}

.canvas-item{

   position: absolute;

   left: 0;

   top: 0;

   width: 100%;

   height: 100%;

   color: #e4370e;

   font-weight: bold;

   text-shadow: 0 1px 1px rgba(255,255,255,.6);

}

(3)js中需要实现转盘转动的六个分区,需要用Math的相关属性,其用法类似于时钟(小编前面的《动态时钟》的文章中也有相关介绍,可以去了解一下);然后转盘旋转需要调用wx.createAnimation,设置旋转参数,包括转速和频率等;中奖提示调用wx.showModal,在里面设置中奖内容即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 旋转抽奖

     app.runDegs = app.runDegs || 0

     console.log('deg', app.runDegs)

     app.runDegs = app.runDegs + (360 - app.runDegs % 360) + (360 * runNum  - awardIndex * (360 / 6))

     console.log('deg', app.runDegs)

     var animationRun = wx.createAnimation({

       duration: 4000,

       timingFunction: 'ease'

     })

     that.animationRun = animationRun

     animationRun.rotate(app.runDegs).step()

     that.setData({

       animationData: animationRun.export(),

      btnDisabled: 'disabled'

     })

     // 中奖提示

     setTimeout(function() {

       wx.showModal({

         title: '恭喜',

         content: '获得' +  (awardsConfig.awards[awardIndex].name),

         showCancel: false

       })

       if (awardsConfig.chance) {

         that.setData({

           btnDisabled: ''

         }) 

       }

     }, 4000);

   },

   onReady: function (e) {

     var that = this;

     // getAwardsConfig

     app.awardsConfig = {

       chance: true,

       awards:[

         {'index': 0, 'name': '1元红包'},

         {'index': 1, 'name': '5元话费'},

         {'index': 2, 'name': '6元红包'},

         {'index': 3, 'name': '8元红包'},

         {'index': 4, 'name': '10元话费'},

         {'index': 5, 'name': '10元红包'}

       ]

     }

     // 绘制转盘

     var awardsConfig = app.awardsConfig.awards,

         len = awardsConfig.length,

         rotateDeg = 360 / len / 2 + 90,

         html = [],

         turnNum = 1 / len  // 文字旋转 turn 值

     that.setData({

       btnDisabled: app.awardsConfig.chance ? '' : 'disabled' 

     })

     var ctx = wx.createContext()

     for (var i = 0; i < len; i++) {

       // 保存当前状态

       ctx.save();

       // 开始一条新路径

       ctx.beginPath();

       // 位移到圆心,下面需要围绕圆心旋转

       ctx.translate(150, 150);

       // 从(0, 0)坐标开始定义一条新的子路径

       ctx.moveTo(0, 0);

       // 旋转弧度,需将角度转换为弧度,使用 degrees * Math.PI/180 公式进行计算。

       ctx.rotate((360 / len * i - rotateDeg) * Math.PI/180);

       // 绘制圆弧

       ctx.arc(0, 0, 150, 0,  2 *  Math.PI / len, false);

       // 颜色间隔

       if (i % 2 == 0) {

           ctx.setFillStyle('rgba(255,184,32,.1)');

       }else{

           ctx.setFillStyle('rgba(255,203,63,.1)');

       }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
企业云上网络服务规划全面指南:基于腾讯云产品的架构设计与实践
在数字化转型浪潮中,企业上云已成为提升业务敏捷性和竞争力的关键举措。然而,云上网络服务的规划与设计直接关系到企业业务的安全性、可用性和扩展性。本文将基于腾讯云产品体系,从网络架构设计原则、核心产品选型、安全防护策略、性能优化方法到运维管理实践,为企业提供一套完整的云上网络服务规划方案。通过深入分析腾讯云的网络基础设施、安全加速能力以及混合云解决方案,帮助企业构建高性能、高可用的云网络环境,同时实现成本优化与合规管理,为业务创新提供坚实的网络基础。
徐关山
2025/06/27
1070
腾讯网关 TGW 基础原理入门
作者:厉辉,腾讯后台研发高级工程师,当前在腾讯游戏后台团队工作,熟悉四七层负载均衡以及 API 网关等技术领域,同时也是 CNCF Ambassador 以及 Apache APISIX PMC。 本文是在组内技术分享的发言稿,主要介绍 TGW 基本原理和架构,同时为了加深理解,会辅助对比 TGW 与 LVS(ipvs)的异同。本次分享是偏基础性的 TGW 介绍,不会特别深入技术细节,目的是帮助需要用到 TGW 的同事快速的了解 TGW。 零、引言 TGW,全称 Tencent Gateway,是一套实现多
腾讯技术工程官方号
2022/04/14
3.9K0
腾讯网关 TGW 基础原理入门
百度王佩龙:云计算网络 软硬件一体化协同实践
5月24日,2022网络开源技术生态峰会(线上)盛大开幕,本届大会由“科创中国”未来网络专业科技服务团指导,江苏省未来网络创新研究院主办,SDNLAB社区承办。在“P4技术与应用”论坛上,百度智能云IaaS网络负责人王佩龙和大家分享了百度云在云计算网络领域的可编程硬件实践。 云计算网络面临的挑战 随着数字化转型和智能化升级的加速,更多的企业级应用开始基于多云、混合云、边缘云等新模式构建,比如自动驾驶、车路协同、物联网、电商、视频、游戏等。这些应用对网络提出了更高的要求,对云网络产生了一系列挑战: 1. 带宽
SDNLAB
2022/05/25
1.9K0
百度王佩龙:云计算网络 软硬件一体化协同实践
出海业务网络加速方案技术能力详解
随着出海业务的持续发展,各出海业务场景对于网络的要求越来越高。本课程针对出海业务的网络加速方案,进行腾讯云全球应用加速技术能力详解。全剧应用加速依赖全球节点之间的高速通道、转发集群及智能路由技术,实现各地用户的就近接入,通过高速通道直达源站区域,帮助业务解决全球用户访问卡顿或者延迟过高的问题。
云大学小编
2020/06/06
3.8K0
出海业务网络加速方案技术能力详解
腾讯云游戏行业整体解决方案
随着游戏行业的迅猛发展,游戏行业竞争日益加剧,好的用户体验度和快速反应能力成为游戏网站发展的关键。游戏行业整体解决方案将能够为游戏厂商提供优质全面便捷的服务。
可可爱爱没有脑袋
2020/01/03
4.4K0
腾讯云游戏行业整体解决方案
如何使用私有网络部署全球同服游戏服务
吴晓斌
2016/10/26
33.3K11
如何使用私有网络部署全球同服游戏服务
必读 | 如何在香港云CVM实现全球anycast-EIP同服加速游戏业务?
某游戏公司,BACKEND 服务集群在首尔。该公司不希望部署多套逻辑和数据层,从而降低成本,但又希望全球的客户能够接入,需要全局漂移 IP 作为访问的唯一入口,并可做全局的就近分配、动态流量分配、故障剔除
TCS-F
2021/11/28
6.2K0
必读 | 如何在香港云CVM实现全球anycast-EIP同服加速游戏业务?
全面理解云上网络
作者:ronaldoliu,腾讯 IEG 后台开发工程师 公司一直在推动业务上云,同时越来越多的项目也要开始出海,对云的依赖会越来越多。但是云并不像它宣传的那么简单易用,尤其是云上网络,是大家理解云的一大阻碍。本文比较全面地梳理了云上网络的各种概念以及简要的原理,希望能够帮助大家建立一个知识索引,以备不时之需。由于本人不是云的专家,因此文章中有不对的地方也欢迎指正。 私有网络 VPC VPC 全称 Virtual Private Cloud,翻译成私有网络其实不太准确,但是它确实就是对网络资源的一种抽象。我
腾讯技术工程官方号
2022/06/20
12.4K1
全面理解云上网络
基于腾讯云的业务全球化部署
在国内人口红利逐渐消失,竞争严峻的情况下,越来越多的中国企业开始寻求新的增长点。印度、非洲、东南亚等国巨大的人口红利很有可能成为中国企业的新战场。截至2017年底,中国在非洲投资总额达到1000亿美元,几乎遍布非洲的每个国家,涵盖科技、地质勘察、房地产、金融、批发零售和农业等领域。伴随着业务出海,业务系统需要服务全球用户,这就涉及到了全球化部署。虽然互联网本身就是全球可访问的,但是受限于国家政策等因素的影响,可能导致用户访问受阻,而有些应用时性要求较高,如IM工具等,都需要就近访问。因此全球化部署的需求也就应运而生。本文包含如下几个方面的内容:
杨泽华
2020/02/12
6.3K1
腾讯云高可用网络的修炼之道
当他睡眼惺忪、手拿红牛、嘴刁香烟迈着沉重的步伐从某网络核心机房走出来的时候,除了看门大爷简短问候之外,也只有刚刚过去的这个黑夜才真正懂得刚刚发生了什么,在外人眼里,这个夜晚再正常不过,和往常一样,刷刷微博、看看抖音,逛逛购物网站,即便是前一晚上有某些人觉得打开购物网站的页面有点卡慢,他们也可能不会放在心上,然而正是因为这样一个不一样的网络体验,网络工程师们已经是废寝忘食,鏖战了整整一夜,来修复引发这个网络卡慢的bug,在外人眼里一觉醒来,看似波澜不惊,但有时实则是暗流涌动;
abelbai
2020/10/31
12.5K2
腾讯云高可用网络的修炼之道
腾讯云虚拟网络架构揭秘
腾讯云开发者社区
2017/12/12
9.7K0
【玩转腾讯云】静态CDN、动态CDN、GAAP、AIA各种加速产品介绍
受限于光速,网络延迟总是有一个下限,是无法超越物理极限的。本人实测,使用腾讯云的云联网,中国上海到美国硅谷内网ping延迟138ms,这基本是最佳的网络延迟了。
sherlock99
2019/06/21
21.5K0
【玩转腾讯云】静态CDN、动态CDN、GAAP、AIA各种加速产品介绍
公有云降本增效最佳实践
最近看到了几个事情,一个是某保险系统,为了快速上线,全量上云,结果生产正式运行后每月账单高达几十万。相关业务总扛不住这个支出,又劳师动众,让下面的项目经理、开发、运维、架构师花了3个月把业务全量从公有云迁移下来。相关人员被折磨的半死不活,而且大大拖慢了系统的迭代速度。
东风微鸣
2022/04/22
2.6K0
腾讯云COS全球加速,解决弱网传输慢的难题!
对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,使用COS可以实现海量数据存储及管理,结合腾讯云遍布全国范围的CDN节点可以对COS存储桶中的对象进行访问加速。
云存储
2020/03/19
4K0
腾讯云COS全球加速,解决弱网传输慢的难题!
腾讯云公网负载均衡技术实现详解
朱彬峰
2017/04/23
23.6K4
腾讯云公网负载均衡技术实现详解
Supermind智能网络:全网加速+多地同服是如何炼成的?
腾讯云开发者社区
2017/12/05
3.2K0
【新功能!】Anycast CLB 如何支持多地&动态加速的负载均衡服务,高速互联转发!
负载均衡支持创建 Anycast 负载均衡(下文也叫 Anycast CLB)实例,Anycast CLB 是支持多地动态加速的负载均衡服务,CLB 的 VIP 会发布在多个地域,客户端接入最近的 POP 接入点,通过腾讯云数据中心高速互联网转发到云服务器上。 Anycast CLB 能实现网络传输的质量优化和多入口就近接入,减少网络传输的抖动、丢包,最终提升云上应用的服务质量,扩大服务范围,精简后端部署。 本功能内测中,如需使用,请提交 内测申请。
TCS-F
2021/11/11
9.5K0
【新功能!】Anycast CLB 如何支持多地&动态加速的负载均衡服务,高速互联转发!
腾讯安全发布Tencent Cloud EdgeOne,为企业出海打造安全加速一体化服务
7月29日,腾讯安全面向全球正式发布边缘安全加速平台Tencent Cloud EdgeOne,依托全球2800多个边缘节点和20多年安全技术积累,为企业打造安全防护、性能加速及相关技术支持的边缘一体化服务。该平台集成DNS解析、四层代理、站点加速、智能加速、DDoS防护、Web防护、Bot防护、负载均衡等十余项功能,致力于同时保障企业平台的安全稳定和用户体验,护航全球化企业及出海企业的数字化转型。这也是腾讯安全面向全球企业级市场发布的首款战略产品。
腾讯安全
2022/08/02
1K0
腾讯安全发布Tencent Cloud EdgeOne,为企业出海打造安全加速一体化服务
【参赛经验分享】腾讯云-云联网-全球互联技术实践文档
随着全球互联网络技术不断革新,全球云厂商地域互联需求增加,越来越多企业急需解决云端多地域内网互联,低时延,高通信等需求,腾讯云依据大量用户需求,推出【云联网】3.0产品。以下实践主要是利用腾讯云-云联网产品,打通全球VPC环境,实现内网互通,全球互联的实践技术文档。
TCS-F
2019/05/14
5.6K0
【参赛经验分享】腾讯云-云联网-全球互联技术实践文档
给长通物流业务系统做的基于腾讯云的上云解决方案
长通物流是一家基于供应链管理集运输、仓储、物流配送、产品代理一体化的全方位综合物流服务商。随着社会的发展,行业环境的改变,为满足用户的需求不断创新,现在先研发第三代物流管理系统,预期8月部署上线,新系统的部署采用云服务的方式,满足新业务的安全需求、访问需求等。
中云微迅
2019/10/22
1.8K0
给长通物流业务系统做的基于腾讯云的上云解决方案
推荐阅读
相关推荐
企业云上网络服务规划全面指南:基于腾讯云产品的架构设计与实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档