微信小程序利用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 插件学习(三)
Aug 06 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
Sep 27 Javascript
jQuery结合ajax实现动态加载文本内容
May 19 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
Aug 25 Javascript
详解jQuery中的empty、remove和detach
Apr 11 Javascript
深入理解jQuery之事件移除
Jun 02 Javascript
JS中数组重排序方法
Nov 11 Javascript
20行JS代码实现粘贴板复制功能
Feb 06 Javascript
jQuery实现的页面详情展开收起功能示例
Jun 11 jQuery
微信小程序开发实现消息推送
Nov 18 Javascript
JavaScript 定时器详情
Nov 11 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学习笔记之 函数声明(二)
2011/06/09 PHP
destoon常用的安全设置概述
2014/06/21 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jquery中radio checked问题
2015/03/16 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
vue props对象validator自定义函数实例
2019/11/13 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
python写的一个文本编辑器
2014/01/23 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
tornado 多进程模式解析
2018/01/15 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
python cs架构实现简单文件传输
2020/03/20 Python
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
男方父母证婚词
2014/01/12 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
大学生团员个人总结
2015/02/14 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
react 路由Link配置详解
2021/11/11 Javascript
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL