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


Posted in Javascript onJuly 06, 2018

小程序对 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 绘制幸运大转盘功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery学习笔记之jQuery的DOM操作
Dec 22 Javascript
jquery动态改变form属性提交表单
Jun 03 Javascript
JS根据年月获得当月天数的实现代码
Jul 03 Javascript
jquery学习总结(超级详细)
Sep 04 Javascript
纯JS实现可拖拽表单的简单实例
Sep 02 Javascript
JS实现一个简单的日历
Feb 22 Javascript
javascript帧动画(实例讲解)
Sep 02 Javascript
vue-cli 3.x 修改dist路径的方法
Sep 19 Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
JS二级菜单不同实现方法分析【4种方法】
Dec 21 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
Nov 16 Javascript
JavaScript实现复选框全选和取消全选
Nov 20 Javascript
用Node提供静态文件服务的方法
Jul 06 #Javascript
vue使用监听实现全选反选功能
Jul 06 #Javascript
vue 实现数字滚动增加效果的实例代码
Jul 06 #Javascript
详解在Vue中使用TypeScript的一些思考(实践)
Jul 06 #Javascript
javascript显示动态时间的方法汇总
Jul 06 #Javascript
Django+Vue跨域环境配置详解
Jul 06 #Javascript
微信小程序画布圆形进度条显示效果
Nov 17 #Javascript
You might like
咖啡的植物学知识
2021/03/03 咖啡文化
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
PHP使用递归生成文章树
2015/04/21 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
HTML代码中标签的全部属性 中文注释说明
2009/03/26 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
jquery xMarquee实现文字水平无缝滚动效果
2014/04/29 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
js实现页面刷新滚动条位置不变
2016/11/27 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
python求crc32值的方法
2014/10/05 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
python实现画一颗树和一片森林
2018/06/25 Python
对于Python深浅拷贝的理解
2019/07/29 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
餐饮采购员岗位职责
2014/03/15 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
Pandas数据类型之category的用法
2021/06/28 Python
服务器nginx权限被拒绝解决案例
2022/09/23 Servers