微信小程序利用canvas 绘制幸运大转盘功能
程序员文章站
2022-06-08 20:34:39
小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码
page({
/**
* 页面的初始数据
*/
data: {...
小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码
page({ /** * 页面的初始数据 */ data: { awardsconfig: {}, restaraunts: [], //大转盘奖品信息 }, /** * 生命周期函数--监听页面加载 */ onload: function (options) { var self = this; wx.getsysteminfo({ //获取系统信息成功,将系统窗口的宽高赋给页面的宽高 success: function (res) { self.width = res.windowwidth self.height = res.windowheight } }) self.data.awardsconfig = { chance: true, awards: self.data.restaraunts//存放奖项信息 } self.tab(); }) }, tab: function() { var self = this; // 绘制转盘 var awardsconfig = self.data.awardsconfig.awards, len = awardsconfig.length, rotatedeg = 360 / len / 2 + 90, html = [], turnnum = 1 / len // 文字旋转 turn 值 self.setdata({ btndisabled: self.data.awardsconfig.chance ? '' : 'disabled' }) var ctx = wx.createcontext(); for (var i = 0; i < len; i++) { var w = self.width; //页面宽 var r = w * 0.38; //圆半径 0.35w // 保存当前状态 ctx.save(); // 开始一条新路径 ctx.beginpath(); // 位移到圆心,下面需要围绕圆心旋转 // ctx.translate(150, 150); ctx.translate(w / 2 - 14, w / 2 - 18); // 从(0, 0)坐标开始定义一条新的子路径 ctx.moveto(0, 0); // 旋转弧度,需将角度转换为弧度,使用 degrees * math.pi/180 公式进行计算。 ctx.rotate((360 / len * i - rotatedeg) * math.pi / 180); // 绘制圆弧 ctx.arc(0, 0, r, 0, 2 * math.pi / len, false); // 颜色间隔 if (i % 2 == 0) { ctx.setfillstyle('#ffffff'); } else { ctx.setfillstyle('#ffeab0'); } // 填充扇形 ctx.fill(); // 绘制边框 ctx.setlinewidth(0.5); ctx.setstrokestyle('#e4370e'); ctx.stroke(); // 恢复前一个状态 ctx.restore(); // 奖项列表 html.push({ turn: (i + 1) * turnnum + 'turn', award: awardsconfig[i] }); } self.setdata({ awardslist: html }); wx.drawcanvas({ canvasid: 'canvas', actions: ctx.getactions() }) }, inner: function(e) { const self = this; if (self.data.awardsconfig.chance) { self.data.awardsconfig.chance = false;//转动时禁止再次触发点击事件 var json = res.data;//后端自动分配奖项,并传给前端奖项信息 var item = parseint(json.grade); //获取从1到奖品数量之间的随机数 self.getlottery(item + 1, self.data.restaraunts[item]); //奖项位置 (+1 是为了转动的时候计算角度),对应奖项 } }, getlottery: function(item, txt) { var self = this var awardsconfig = self.data.awardsconfig.awards, len = awardsconfig.length; var awardindex = item; // 获取奖品配置 var awardsconfig = self.data.awardsconfig if (awardindex < 2) awardsconfig.chance = false // 初始化 rotate var animationinit = wx.createanimation({ duration: 1 }) this.animationinit = animationinit; animationinit.rotate(0).step() this.setdata({ animationdata: animationinit.export(), btndisabled: 'disabled' }) // 旋转抽奖 执行动画效果 settimeout(function () { var animationrun = wx.createanimation({ duration: 4000, timingfunction: 'ease' }) self.animationrun = animationrun animationrun.rotate(0 - (360 * 8 - awardindex * (360 / len))).step() self.setdata({ animationdata: animationrun.export() }) }, 100) // 记录奖品 var winawards = wx.getstoragesync('winawards') || { data: [] } var textinfo = txt === "谢谢参与" ? txt : txt + '1个'; winawards.data.push(textinfo) wx.setstoragesync('winawards', winawards) var jh = parseint(self.data.jh) - 1; // 中奖提示 settimeout(function () { if (txt === "谢谢参与") { wx.showmodal({ title: '很遗憾', content: '祝您好运', showcancel: false }) } else { wx.showmodal({ title: '恭喜', content: '获得' + txt, showcancel: false }) } self.data.awardsconfig.chance = true; if (awardsconfig.chance) { self.setdata({ btndisabled: '' }) } }, 4100); }, function(err) { console.log(err) console.log("err") //error }) }, /** * 生命周期函数--监听页面初次渲染完成 */ onready: function() { // this.drawturntable(this, new date()); }, /** * 生命周期函数--监听页面显示 */ onshow: function() { }, /** * 生命周期函数--监听页面隐藏 */ onhide: function() { }, /** * 生命周期函数--监听页面卸载 */ onunload: function() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onpulldownrefresh: function() { }, /** * 页面上拉触底事件的处理函数 */ onreachbottom: function() { }, /** * 用户点击右上角分享 */ onshareappmessage: function() { } })
小程序 canvas 层级永远在最上级,如果想要设置在canvas上面 就需要用到web-view 或者 web-image 这样就能居于canvas 上层了 ,具体可以去查看下小程序的api 搜索web-view 这里就不多解释啦,如有错误之处,还希望各位不吝赐教
总结
以上所述是小编给大家介绍的微信小程序利用canvas 绘制幸运大转盘功能,希望对大家有所帮助
上一篇: PS制作从茶壶里出来的小女孩效果图