微信小程序利用canvas 繪制幸運(yùn)大轉(zhuǎn)盤(pán)功能
小程序?qū)?canvas api 跟h5的不太一致 ,所以這個(gè)搞的比較久,不多說(shuō),先貼代碼
Page({
/**
* 頁(yè)面的初始數(shù)據(jù)
*/
data: {
awardsConfig: {},
restaraunts: [], //大轉(zhuǎn)盤(pán)獎(jiǎng)品信息
},
/**
* 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載
*/
onLoad: function (options) {
var self = this;
wx.getSystemInfo({
//獲取系統(tǒng)信息成功,將系統(tǒng)窗口的寬高賦給頁(yè)面的寬高
success: function (res) {
self.width = res.windowWidth
self.height = res.windowHeight
}
})
self.data.awardsConfig = {
chance: true,
awards: self.data.restaraunts//存放獎(jiǎng)項(xiàng)信息
}
self.tab();
})
},
tab: function() {
var self = this;
// 繪制轉(zhuǎn)盤(pán)
var awardsConfig = self.data.awardsConfig.awards,
len = awardsConfig.length,
rotateDeg = 360 / len / 2 + 90,
html = [],
turnNum = 1 / len // 文字旋轉(zhuǎn) turn 值
self.setData({
btnDisabled: self.data.awardsConfig.chance ? '' : 'disabled'
})
var ctx = wx.createContext();
for (var i = 0; i < len; i++) {
var w = self.width; //頁(yè)面寬
var r = w * 0.38; //圓半徑 0.35w
// 保存當(dāng)前狀態(tài)
ctx.save();
// 開(kāi)始一條新路徑
ctx.beginPath();
// 位移到圓心,下面需要圍繞圓心旋轉(zhuǎn)
// ctx.translate(150, 150);
ctx.translate(w / 2 - 14, w / 2 - 18);
// 從(0, 0)坐標(biāo)開(kāi)始定義一條新的子路徑
ctx.moveTo(0, 0);
// 旋轉(zhuǎn)弧度,需將角度轉(zhuǎn)換為弧度,使用 degrees * Math.PI/180 公式進(jìn)行計(jì)算。
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();
// 恢復(fù)前一個(gè)狀態(tài)
ctx.restore();
// 獎(jiǎng)項(xiàng)列表
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;//轉(zhuǎn)動(dòng)時(shí)禁止再次觸發(fā)點(diǎn)擊事件
var json = res.data;//后端自動(dòng)分配獎(jiǎng)項(xiàng),并傳給前端獎(jiǎng)項(xiàng)信息
var item = parseInt(json.grade); //獲取從1到獎(jiǎng)品數(shù)量之間的隨機(jī)數(shù)
self.getLottery(item + 1, self.data.restaraunts[item]); //獎(jiǎng)項(xiàng)位置 (+1 是為了轉(zhuǎn)動(dòng)的時(shí)候計(jì)算角度),對(duì)應(yīng)獎(jiǎng)項(xiàng)
}
},
getLottery: function(item, txt) {
var self = this
var awardsConfig = self.data.awardsConfig.awards,
len = awardsConfig.length;
var awardIndex = item;
// 獲取獎(jiǎng)品配置
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'
})
// 旋轉(zhuǎn)抽獎(jiǎng) 執(zhí)行動(dòng)畫(huà)效果
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)
// 記錄獎(jiǎng)品
var winAwards = wx.getStorageSync('winAwards') || {
data: []
}
var textInfo = txt === "謝謝參與" ? txt : txt + '1個(gè)';
winAwards.data.push(textInfo)
wx.setStorageSync('winAwards', winAwards)
var jh = parseInt(self.data.jh) - 1;
// 中獎(jiǎng)提示
setTimeout(function () {
if (txt === "謝謝參與") {
wx.showModal({
title: '很遺憾',
content: '祝您好運(yùn)',
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
})
},
/**
* 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面初次渲染完成
*/
onReady: function() {
// this.drawTurntable(this, new Date());
},
/**
* 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面顯示
*/
onShow: function() {
},
/**
* 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面隱藏
*/
onHide: function() {
},
/**
* 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面卸載
*/
onUnload: function() {
},
/**
* 頁(yè)面相關(guān)事件處理函數(shù)--監(jiān)聽(tīng)用戶(hù)下拉動(dòng)作
*/
onPullDownRefresh: function() {
},
/**
* 頁(yè)面上拉觸底事件的處理函數(shù)
*/
onReachBottom: function() {
},
/**
* 用戶(hù)點(diǎn)擊右上角分享
*/
onShareAppMessage: function() {
}
})
小程序 canvas 層級(jí)永遠(yuǎn)在最上級(jí),如果想要設(shè)置在canvas上面 就需要用到web-view 或者 web-image 這樣就能居于canvas 上層了 ,具體可以去查看下小程序的api 搜索web-view 這里就不多解釋啦,如有錯(cuò)誤之處,還希望各位不吝賜教
總結(jié)
以上所述是小編給大家介紹的微信小程序利用canvas 繪制幸運(yùn)大轉(zhuǎn)盤(pán)功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Extjs4實(shí)現(xiàn)兩個(gè)GridPanel之間數(shù)據(jù)拖拽功能具體方法
這篇文章主要介紹了Extjs4實(shí)現(xiàn)兩個(gè)GridPanel之間數(shù)據(jù)拖拽功能具體方法,有需要的朋友可以參考一下2013-11-11
前端實(shí)現(xiàn)水印功能的幾種方法及優(yōu)缺點(diǎn)
這篇文章主要介紹了前端開(kāi)發(fā)中實(shí)現(xiàn)網(wǎng)頁(yè)或圖像水印的六種方法,包括使用CSS背景圖、HTML5?Canvas、SVG、圖片處理庫(kù)、HTML?DOM元素以及后端生成,每種方法都有其優(yōu)缺點(diǎn),適用于不同的場(chǎng)景,需要的朋友可以參考下2025-01-01
javaScript中with函數(shù)用法實(shí)例分析
這篇文章主要介紹了javaScript中with函數(shù)用法,實(shí)例分析了javascript中with的功能、定義及相關(guān)使用技巧,需要的朋友可以參考下2015-06-06
js位運(yùn)算在實(shí)際中使用的實(shí)例教程
我們可能很少在編程中用位運(yùn)算,如果沒(méi)深入學(xué)習(xí),可能也很難理解,下面這篇文章主要給大家介紹了關(guān)于js位運(yùn)算在實(shí)際中使用的相關(guān)資料,需要的朋友可以參考下2022-03-03
30個(gè)高逼格代碼的JavaScript高級(jí)單行代碼
這篇文章中列出了一個(gè)系列的 30 個(gè) JavaScript 單行代碼,它們?cè)谑褂?nbsp;vanilla js(≥ ES6)進(jìn)行開(kāi)發(fā)時(shí)非常有用,它們也是使用該語(yǔ)言在最新版本中為我們提供的所有功能來(lái)解決問(wèn)題的優(yōu)雅方式,將它們分為以下5大類(lèi):日期、字符串、數(shù)字、數(shù)組、工具2023-08-08
JS實(shí)現(xiàn)的JSON數(shù)組去重算法示例
這篇文章主要介紹了JS實(shí)現(xiàn)的JSON數(shù)組去重算法,結(jié)合實(shí)例形式分析了javascript針對(duì)json數(shù)組的遍歷、判斷實(shí)現(xiàn)去重復(fù)功能相關(guān)操作技巧,需要的朋友可以參考下2018-04-04

