微信小程序利用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 相关文章推荐
使用js正则控制input标签只允许输入的值
Jul 29 Javascript
javascript中interval与setTimeOut的区别示例介绍
Mar 14 Javascript
Egret引擎开发指南之发布项目
Sep 03 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
Aug 15 Javascript
bootstrap datetimepicker控件位置异常的解决方法
Nov 23 Javascript
微信小程序自定义组件实现tabs选项卡功能
Jul 14 Javascript
vue中实现上传文件给后台实例详解
Aug 22 Javascript
关于vue表单提交防双/多击的例子
Oct 31 Javascript
vue 子组件和父组件传值的示例
Sep 11 Javascript
解决VueCil代理本地proxytable无效报错404的问题
Nov 07 Javascript
使用node-media-server搭建一个简易的流媒体服务器
Jan 20 Javascript
vue实现同时设置多个倒计时
May 20 Vue.js
用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 session 错误
2009/05/21 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
smarty简单应用实例
2015/11/03 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
NodeJS和BootStrap分页效果的实现代码
2016/11/07 NodeJs
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
python单例模式实例分析
2015/04/08 Python
Python中字典的基本知识初步介绍
2015/05/21 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
python验证码识别实例代码
2018/02/03 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
python内存动态分配过程详解
2019/07/15 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
python使用smtplib模块发送邮件
2020/12/17 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript