微信小程序利用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 相关文章推荐
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 Javascript
checkbox全选所涉及到的知识点介绍
Dec 31 Javascript
实现placeholder效果的方案汇总
Jun 11 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
Aug 22 Javascript
简介alert()与console.log()的不同
Aug 26 Javascript
JavaScript通过代码调用Flash显示的方法
Feb 02 Javascript
jQuery用FormData实现文件上传的方法
Nov 21 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 Javascript
微信小程序实现上拉加载功能
Nov 20 Javascript
vue使用swiper实现中间大两边小的轮播图效果
Nov 24 Javascript
详解webpack的clean-webpack-plugin插件报错
Oct 16 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
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
vue实现拖拽效果
2019/12/23 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
python如何在终端里面显示一张图片
2016/08/17 Python
Python docx库用法示例分析
2019/02/16 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
工商管理实习生自我鉴定范文
2013/12/18 职场文书
学生会部长竞聘书
2014/03/31 职场文书
初三班主任寄语大全
2014/04/04 职场文书
金融与证券专业求职信
2014/06/22 职场文书
校本教研活动总结
2014/07/01 职场文书
办公室禁烟通知
2015/04/23 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
工作自我评价范文
2019/03/21 职场文书
Android 中的类文件和类加载器详情
2022/06/05 Java/Android