欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微信小程序利用canvas 绘制幸运大转盘功能

程序员文章站 2023-11-03 22:13:16
小程序对 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 绘制幸运大转盘功能,希望对大家有所帮助