小程序新版canvas绘制大转盘(可配置)

Selena ·
更新时间:2024-09-21
· 721 次阅读

效果图
在这里插入图片描述
wxml

wxss

.turntable{ position:relative; } .turntableCanvas{ margin:0 auto; transform-origin:50% 50%; } .zhizhen{ position:absolute; z-index:2; top:0; left:0; bottom:0; right:0; margin:auto; width:162rpx; height:207rpx; }

js

// pages/index2/index.js Page({ /** * 页面的初始数据 */ data: { canvasWidth:600, canvasHeight:600, rotate:0, prizeList:[ { text:'奖品一', imgurl:'../../img/koushuidou.png' }, { text: '奖品二', imgurl: '../../img/maozi.png' }, { text: '奖品一一', imgurl: '../../img/naiping.png' }, { text: '奖品', imgurl: '../../img/shuibei.png' }, { text: '奖', imgurl: '../../img/xiaohuangya.png' }, { text: '奖123', imgurl: '../../img/yingerche.png' }, ] }, onLoad(){ let that = this; wx.getSystemInfo({ success(res) { //圆边背景色 that.colorBj = "red" //圆边宽度 that.outsideWidth = 20; //小灯个数 建议 lightNum % 2 == 0 && 360 % lightNum == 0 that.lightNum = 12; //小灯半径 必须小于圆边宽度的一半 that.lightWidth = 4; //小灯颜色(一个正常,一个高亮,初始都正常) that.lightBgType = ['#fff', '#f5c058']; that.lightBg = []; for (var i = 0; i < that.lightNum; i++) { that.lightBg.push(that.lightBgType[0]); } //奖品个数 that.prizeNum = that.data.prizeList.length; //扇形颜色 that.sectorBjOne = "#ffe8b5"; that.sectorBjTwo = "#ffb933"; //文字颜色 that.textColor = "#5c1e08"; //文字大小及字体 that.textStyle = "16px Georgia"; //文字距离圆边的距离 that.textTop = 14; //图片距离圆边的距离 that.imgTop = 40; //图片宽度(这个需要自己查看图片属性) that.imgWidth = 32; //旋转结束值 that.rotateEnd= 0; //偏差角 that.deviation = 0; for (var i = 0; i 270) { that.deviation = i * 360 / that.prizeNum - 270; break; } else { i++; } } that.canvas(); } }) }, canvas() { const query = wx.createSelectorQuery(); query.select('#turntable') .fields({ node: true, size: true }) .exec((res) => { var canvas = res[0].node; var dpr = wx.getSystemInfoSync().windowWidth / 750; canvas.width = this.data.canvasWidth * dpr; canvas.height = this.data.canvasHeight * dpr; this.canvasWidth = this.data.canvasWidth * dpr; this.canvasHeight = this.data.canvasHeight * dpr; var canvasContext = canvas.getContext('2d') canvasContext.clearRect(0, 0, this.canvasWidth, this.canvasHeight); //绘制圆边背景 canvasContext.beginPath(); canvasContext.fillStyle = this.colorBj; canvasContext.arc(this.canvasWidth / 2, this.canvasHeight / 2, this.canvasWidth / 2, 0, 2 * Math.PI); canvasContext.fill(); canvasContext.closePath(); //绘制周边小灯 for (var i = 0; i < this.lightNum; i++) { canvasContext.beginPath(); canvasContext.fillStyle = this.lightBg[i]; canvasContext.arc(this.canvasWidth / 2 + (this.canvasWidth / 2 - this.outsideWidth / 2) * Math.cos(360 / this.lightNum * i * Math.PI / 180), this.canvasHeight / 2 + (this.canvasHeight / 2 - this.outsideWidth / 2) * Math.sin(360 / this.lightNum * i * Math.PI / 180), this.lightWidth, 0, 2 * Math.PI); canvasContext.fill(); canvasContext.closePath(); } //奖品扇形 for (var i = 0; i < this.prizeNum; i++){ canvasContext.beginPath(); canvasContext.moveTo(this.canvasWidth / 2, this.canvasHeight / 2); canvasContext.lineTo(this.canvasWidth / 2 + (this.canvasWidth / 2 - this.outsideWidth) * Math.cos(360 / this.prizeNum * i * Math.PI / 180), this.canvasHeight / 2 + (this.canvasHeight / 2 - this.outsideWidth) * Math.sin(360 / this.prizeNum * i * Math.PI / 180)); canvasContext.arc(this.canvasWidth / 2, this.canvasHeight / 2, this.canvasWidth / 2 - this.outsideWidth, 360 / this.prizeNum * Math.PI / 180 * i, 360 / this.prizeNum * Math.PI / 180 * (i + 1)); canvasContext.moveTo(this.canvasWidth / 2, this.canvasHeight / 2); canvasContext.lineTo(this.canvasWidth / 2 + (this.canvasWidth / 2 - this.outsideWidth) * Math.cos(360 / this.prizeNum * (i + 1) * Math.PI / 180), this.canvasHeight / 2 + (this.canvasHeight / 2 - this.outsideWidth) * Math.sin(360 / this.prizeNum * (i + 1) * Math.PI / 180)); if (i % 2 == 0) { canvasContext.fillStyle = this.sectorBjOne; } else { canvasContext.fillStyle = this.sectorBjTwo; } canvasContext.fill(); canvasContext.closePath(); } //绘制文字与图片 let img = []; for (let i = 0; i { canvasContext.save(); canvasContext.beginPath(); canvasContext.translate(this.canvasWidth / 2, this.canvasHeight / 2); canvasContext.rotate((this.deviation - 360 / (this.prizeNum * 2) * (i * 2 + 1)) * Math.PI / 180); canvasContext.translate(-this.canvasWidth / 2, -this.canvasHeight / 2); canvasContext.fillStyle = this.textColor; canvasContext.font = this.textStyle; canvasContext.textAlign = 'center'; canvasContext.textBaseline = 'top'; canvasContext.fillText(this.data.prizeList[i].text, this.canvasWidth / 2, this.outsideWidth + this.textTop); canvasContext.drawImage(img[i], this.canvasWidth / 2 - this.imgWidth / 2, this.outsideWidth + this.imgTop) canvasContext.closePath(); canvasContext.restore(); } } }) }, start() { //逆时针 // this.rotateEnd = this.rotateEnd+ -360 * 3 + -this.rand(0, 360); // Math.floor this.timerApi = setInterval(()=>{ //下面的初始速度speed大约60,所以此处+60 this.setData({ rotate: this.data.rotate + 60 }) },100) console.log('请求中...') setTimeout(() => { console.log('请求成功...') clearInterval(this.timerApi); this.setData({ rotate: 0 }) //请求接口返回获得了哪个奖,现在是下标为1的奖 var i = 1; this.rotateEnd = 360 * 3 + this.rand(360 / this.prizeNum * i + 1, 360 / this.prizeNum * (i + 1) - 1) - this.deviation; let speed = Math.ceil(((this.rotateEnd - this.data.rotate) / 20)); // console.log(this.rotateEnd, speed); this.timerInterval = setInterval(() => { speed = Math.ceil(((this.rotateEnd - this.data.rotate) / 20)); // console.log(this.data.rotate, speed) if (this.data.rotate + speed >= this.rotateEnd) { this.setData({ rotate: this.rotateEnd % 360 }) this.rotateEnd = this.rotateEnd % 360; let prize = (Math.floor((Math.abs(this.data.rotate) + this.deviation) / (360 / this.prizeNum))); if (prize == this.prizeNum) { prize = 0; } console.log(this.data.prizeList[prize]); clearInterval(this.timerInterval); // clearTimeout(this.timerTimeout); } else { this.setData({ rotate: this.data.rotate + speed }) } }, 100) //取消重绘(取消效果:周边灯闪烁;原因:小程序性能差,重绘太慢;解决方法:单独为周边灯绘制一个canvas,此处不予解决) // this.timerTimeout = setInterval(() => { // this.lightBg = []; // for (var i = 0; i < this.lightNum; i++) { // if (this.rand(0, 9) < 2) { // this.lightBg.push(this.lightBgType[1]); // } else { // this.lightBg.push(this.lightBgType[0]); // } // } // console.log(this.lightBg); // this.canvas(); // }, 2000) }, 1000) }, rand(n, m){ var c = m - n + 1; return Math.floor(Math.random() * c + n); } })

博客个人博客地址:点击跳转


作者:风舞红枫



小程序 程序 大转盘 canvas

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章