本文实例为大家分享了微信小程序实现转盘抽奖的具体代码,供大家参考,具体内容如下
lucky-draw.wxss:
.lucky_draw_zp{ width: 502rpx; height: 502rpx; margin: 0 auto; position: relative;} .lucky_draw_zp_img , .lucky_draw_zp_btn{ width: 100%; height: 100%; position: absolute; left: 0; top: 0;}
lucky-draw.wxml:
<view class="lucky_draw_zp" bindtap="getLucky"> ?? ?<image style="{{zpRotateDeg}}" class="lucky_draw_zp_img" src="{{zpData.zpImg}}" mode="aspectFit"></image> ?? ?<image class="lucky_draw_zp_btn" src="images/zp_btn.png" mode="aspectFit"></image> </view>
lucky-draw.js:
?Page({ ? ?? ?/** ?? ? * 页面的初始数据 ?? ? */ ?? ?data: { ?? ??? ?zpData:{ ?? ??? ??? ?//转盘主图图片url ?? ??? ??? ?zpImg:'images/zp.png', ?? ??? ??? ? ?? ??? ??? ?equalParts:null, //一共多少等份 ?? ??? ??? ?oneAngle:null, //每一等份多少度 ?? ??? ??? ? ?? ??? ??? ?// ******** 转盘奖品数据:后台获取数据 ******** ?? ??? ??? ?//注:根据转盘图片对应的值(转盘图片指针处顺时针向右数,起始1,奖品对应的格子数【第几等份上】) ?? ??? ??? ?awardSetting:[ ?? ??? ??? ??? ?'第1个格子对应内容', ?? ??? ??? ??? ?'第2个格子对应内容', ?? ??? ??? ??? ?'第3个格子对应内容', ?? ??? ??? ??? ?'第4个格子对应内容', ?? ??? ??? ??? ?'第5个格子对应内容', ?? ??? ??? ??? ?'第6个格子对应内容', ?? ??? ??? ?], ?? ??? ?}, ?? ??? ? ?? ??? ?ifRoate:false, //转盘是否在转动(判断阻止多次点击) ?? ??? ?zpRotateDeg:'', //旋转角度 ?? ??? ? ?? ??? ?// ******** 抽奖结果数据:后台获取数据 ******** ?? ??? ?curKey:null, //抽奖结果 : 取值范围 1 至 总格子数 ?? ??? ?ifWinning:null, //是否中奖 ?? ?}, ? ? ? ? ?? ?// 获取转盘初始数据 ?? ?getZpData(){ ?? ??? ?let zpImg = 'zpData.zpImg'; ?? ??? ?let awardSetting = 'zpData.awardSetting'; ?? ??? ?this.setData({ ?? ??? ??? ?[zpImg]:'images/zp.png', ?? ??? ??? ?[awardSetting]:[ ?? ??? ??? ??? ?'1', ?? ??? ??? ??? ?'2', ?? ??? ??? ??? ?'3', ?? ??? ??? ??? ?'4', ?? ??? ??? ??? ?'5', ?? ??? ??? ??? ?'6', ?? ??? ??? ?], ?? ??? ?}); ?? ??? ? ?? ??? ?this.setZpDefault(); ?? ?}, ?? ?// 根据转盘初始数据设置转盘初始关键参数 ?? ?setZpDefault(){ ?? ??? ?let equalPartsNum = this.data.zpData.awardSetting.length; ?? ??? ?let oneAngleNum = 360 / equalPartsNum; ?? ??? ?let equalParts = 'zpData.equalParts'; ?? ??? ?let oneAngle = 'zpData.oneAngle'; ?? ??? ?this.setData({ ?? ??? ??? ?//一共多少等份 ?? ??? ??? ?[equalParts] : equalPartsNum, ?? ??? ??? ?// 根据转盘得等份数设置 每一等份多少度 ?? ??? ??? ?[oneAngle] : oneAngleNum, ?? ??? ?}); ?? ?}, ? ? ?? ?// 设置旋转动效 ?? ?setToRotate(degNum){ ?? ??? ?this.setData({ ?? ??? ??? ?zpRotateDeg : '-webkit-transform: rotate(' + degNum + 'deg);transform: rotate(' + degNum + 'deg);-webkit-transition: all 5s ease;transition: all 5s ease;', ?? ??? ?}); ?? ?}, ?? ?//根据 设置的 指针停止时指向的格子(中奖结果),设置其旋转角度区间 ?? ?setRotate(awardSettingNumber){ //awardSettingNumber ?取值范围 1 至 总格子数 ?? ??? ?setTimeout(() => { ?? ??? ??? ?//转盘停止时 指针 指向的格子 最小角度 ?? ??? ??? ?let minAngle = 360 - awardSettingNumber * this.data.zpData.oneAngle + 5; ?? ??? ??? ?//转盘停止时 指针 指向的格子 最大角度 ?? ??? ??? ?let maxAngle = 360 - (awardSettingNumber - 1) * this.data.zpData.oneAngle - 5; ?? ??? ??? ?//旋转区间 ?? ??? ??? ?let newAngle = Math.floor(minAngle + Math.random() * (maxAngle - minAngle)) + 360 * 15; ?? ??? ??? ? ?? ??? ??? ?this.setToRotate(newAngle); ?? ??? ??? ? ?? ??? ??? ?setTimeout(() => { ?? ??? ??? ??? ?this.roateEnd(awardSettingNumber); ?? ??? ??? ?}, 5150); ?? ??? ?},50); ?? ?}, ?? ?//旋转结束执行 ?? ?roateEnd(awardSettingNumber){ ?? ??? ?console.log('当前指向格子数 -- ' + awardSettingNumber , this.data.curKey); ?? ??? ?console.log('当前指向格子数对应内容 -- ' + this.data.zpData.awardSetting[awardSettingNumber - 1] , this.data.zpData.awardSetting[this.data.curKey - 1]); ?? ??? ? ?? ??? ?// 是否中奖 ?? ??? ?if(this.data.ifWinning){ ?? ??? ??? ?console.log('中奖'); ?? ??? ?}else{ ?? ??? ??? ?console.log('未中奖'); ?? ??? ?} ?? ??? ? ?? ??? ?setTimeout(() => { ?? ??? ??? ?this.setData({ ?? ??? ??? ??? ?ifRoate : false, //转盘是否在转动 ?? ??? ??? ?}); ?? ??? ?}, 100); ?? ?}, ? ? ?? ?//点击抽奖 ?? ?getLucky(){ ?? ??? ?if(this.data.ifRoate){ ?? ??? ??? ?return false; ?? ??? ?} ?? ??? ? ?? ??? ?this.setData({ ?? ??? ??? ?ifRoate : true, //转盘是否在转动 ?? ??? ??? ?zpRotateDeg : '' ?? ??? ?}); ?? ??? ??? ??? ? ?? ??? ?// 请求后台获取抽奖结果中... ?? ??? ? ?? ??? ?/*test*/ ?? ??? ?var res = { ?? ??? ??? ?status:1, ?? ??? ??? ?curKey:Math.floor(1 + Math.random() * this.data.zpData.equalParts), //抽奖结果 : 取值范围 1 至 总格子数 ?? ??? ??? ?ifWinning:true, //是否中奖 ?? ??? ??? ?info:'没机会或什么什么' ?? ??? ?} ?? ??? ?/*test*/ ?? ??? ? ?? ??? ?/ ?? ??? ??? ?if(res.status == 1){ ?? ??? ??? ??? ?this.setData({ ?? ??? ??? ??? ??? ?curKey : res.curKey, ?? ??? ??? ??? ??? ?ifWinning : res.ifWinning ?? ??? ??? ??? ?}); ?? ??? ??? ??? ? ?? ??? ??? ??? ?this.setRotate(this.data.curKey); ?? ??? ??? ?}else{ ?? ??? ??? ??? ?this.setData({ ?? ??? ??? ??? ??? ?ifRoate : false, //转盘是否在转动 ?? ??? ??? ??? ?}); ?? ??? ??? ??? ?wx.showModal({ ?? ??? ??? ??? ??? ?title: '温馨提示', ?? ??? ??? ??? ??? ?showCancel:false, ?? ??? ??? ??? ??? ?content: res.info, ?? ??? ??? ??? ?}) ?? ??? ??? ?} ?? ??? ?/ ?? ?}, ? ? ?? ?/** ?? ? * 生命周期函数--监听页面加载 ?? ? */ ?? ?onLoad: function (options) { ? ?? ?}, ? ?? ?/** ?? ? * 生命周期函数--监听页面初次渲染完成 ?? ? */ ?? ?onReady: function () { ? ?? ?}, ? ?? ?/** ?? ? * 生命周期函数--监听页面显示 ?? ? */ ?? ?onShow: function () { ?? ??? ?this.getZpData(); ?? ?}, ? ?? ?/** ?? ? * 生命周期函数--监听页面隐藏 ?? ? */ ?? ?onHide: function () { ? ?? ?}, ? ?? ?/** ?? ? * 生命周期函数--监听页面卸载 ?? ? */ ?? ?onUnload: function () { ? ?? ?}, ? ?? ?/** ?? ? * 页面相关事件处理函数--监听用户下拉动作 ?? ? */ ?? ?onPullDownRefresh: function () { ? ?? ?}, ? ?? ?/** ?? ? * 页面上拉触底事件的处理函数 ?? ? */ ?? ?onReachBottom: function () { ? ?? ?}, ? ?? ?/** ?? ? * 用户点击右上角分享 ?? ? */ ?? ?onShareAppMessage: function () { ? ?? ?} })
图片资源:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did123608