微信小程序中的转盘抽奖可以通过以下步骤用代码实现:
-
在 wxml 文件中添加一个 canvas 标签,设置宽高和 id,用于绘制转盘。
-
在 js 文件中获取 canvas 对象,设置 canvas 的宽高和绘制上下文。
-
绘制转盘,可以使用 arc 方法绘制圆弧,fill 方法填充颜色,stroke 方法描边。
-
绘制转盘上的奖品,可以使用 fillText 方法绘制文字,也可以使用 drawImage 方法绘制图片。
-
绑定点击事件,触发转盘抽奖功能,可以使用 Math.random 方法生成随机数来确定抽中的奖品。
-
在转盘旋转过程中,可以使用 setInterval 方法定时绘制转盘,同时更新转盘的角度。
-
当转盘停止旋转后,根据抽中的奖品显示相应的提示信息。
示例代码:
wxml 文件:
<canvas id="canvas" style="width: 300px; height: 300px;"></canvas>
js 文件:
Page({
data: {
prizeList: ['一等奖', '二等奖', '三等奖', '谢谢参与'],
colors: ['#ff0000', '#00ff00', '#0000ff', '#cccccc'],
canvasWidth: 300,
canvasHeight: 300,
radius: 100,
startAngle: 0,
endAngle: Math.PI * 2,
prizeAngle: Math.PI / 2,
speed: 0,
acceleration: 0.1,
maxSpeed: 6,
prizeIndex: -1,
isRunning: false
},
onLoad: function () {
this.ctx = wx.createCanvasContext('canvas');
this.draw();
},
draw: function () {
var ctx = this.ctx;
var data = this.data;
var prizeList = data.prizeList;
var colors = data.colors;
var canvasWidth = data.canvasWidth;
var canvasHeight = data.canvasHeight;
var radius = data.radius;
var startAngle = data.startAngle;
var endAngle = data.endAngle;
var prizeAngle = data.prizeAngle;
var prizeIndex = data.prizeIndex;
var isRunning = data.isRunning;
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
// 绘制转盘
ctx.beginPath();
ctx.arc(canvasWidth / 2, canvasHeight / 2, radius, startAngle, endAngle);
colors.forEach(function (color, index) {
ctx.fillStyle = color;
ctx.moveTo(canvasWidth / 2, canvasHeight / 2);
ctx.lineTo(canvasWidth / 2 + radius * Math.cos(startAngle + index * prizeAngle), canvasHeight / 2 + radius * Math.sin(startAngle + index * prizeAngle));
ctx.arc(canvasWidth / 2, canvasHeight / 2, radius, startAngle + index * prizeAngle, startAngle + (index + 1) * prizeAngle);
ctx.fill();
});
ctx.closePath();
// 绘制奖品
ctx.beginPath();
ctx.font = 'bold 20px sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
prizeList.forEach(function (prize, index) {
ctx.fillStyle = '#ffffff';
ctx.fillText(prize, canvasWidth / 2 + (radius - 30) * Math.cos(startAngle + index * prizeAngle + prizeAngle / 2), canvasHeight / 2 + (radius - 30) * Math.sin(startAngle + index * prizeAngle + prizeAngle / 2));
});
ctx.closePath();
// 绘制指针
ctx.beginPath();
ctx.fillStyle = '#ff0000';
ctx.moveTo(canvasWidth / 2 - 10, canvasHeight / 2 - radius - 10);
ctx.lineTo(canvasWidth / 2 + 10, canvasHeight / 2 - radius - 10);
ctx.lineTo(canvasWidth / 2, canvasHeight / 2 - radius);
ctx.fill();
ctx.closePath();
// 如果正在运行,则继续旋转转盘
if (isRunning) {
data.speed += data.acceleration;
if (data.speed > data.maxSpeed) {
data.speed = data.maxSpeed;
}
data.startAngle += data.speed;
if (data.startAngle >= data.endAngle) {
data.startAngle -= data.endAngle;
}
this.setData({
speed: data.speed,
startAngle: data.startAngle
});
setTimeout(this.draw, 10);
} else {
// 如果停止旋转,则显示抽中的奖品
if (prizeIndex >= 0) {
wx.showModal({
title: '恭喜您',
content: '获得' + prizeList[prizeIndex],
showCancel: false
});
this.setData({
prizeIndex: -1
});
}
}
ctx.draw();
},
start: function () {
var data = this.data;
var prizeList = data.prizeList;
var colors = data.colors;
var prizeAngle = data.prizeAngle;
var speed = data.speed;
var maxSpeed = data.maxSpeed;
var prizeIndex = data.prizeIndex;
var isRunning = data.isRunning;
if (isRunning) {
return;
}
prizeIndex = Math.floor(Math.random() * prizeList.length);
data.speed = 0;
data.acceleration = 0.1;
data.maxSpeed = 6 + prizeIndex;
data.prizeIndex = prizeIndex;
data.isRunning = true;
this.draw();
}
})