大转盘抽奖小程序版 转盘抽奖网页版


Posted in Javascript onApril 16, 2020

今天整理了下以前写的小demo,把大转盘抽奖的代码,整合下,列了网页版和小程序两个版本,这个转盘抽奖的核心是H5的canvas和Css3的translate属性,非常简单,写了网页版和小程序版供大家参考,主要核心代码就是利用canvas画图,完整代码见大转盘抽奖,下载可用

希望给大家带来帮助

//转盘内部绘制
lottery.prototype.getCanvasI=function(){
 let itemsArc=360/this.itemsNum //获取大转盘每等分的角度
 this.itemsArc=itemsArc
 let widthI=canvasI.width
 let heightI=canvasI.height
 this.w1=parseInt(widthI/2)
 this.h1=parseInt(heightI/2)
 this.Items(itemsArc)//每一份扇形的内部绘制
 this.mytime=setInterval(this.light.bind(this),1000)
}
//绘制奖品名称
lottery.prototype.Items=function(e){
 let that=this
 let itemsArc=e//每一分扇形的角度
 let Num=that.itemsNum// 等分数量
 let text=that.text// 放文字的数组
 for(let i=0;i<Num;i++){
  ctx.beginPath()
  ctx.moveTo(that.w1,that.h1)
  ctx.arc(that.w1,that.h1,that.w1-5,itemsArc * i * Math.PI / 180, (itemsArc + itemsArc * i) * Math.PI / 180)//绘制扇形,注意下一个扇形比上一个扇形多一个itemsArc的角度
  ctx.closePath()
  if (i % 2 == 0) {//绘制偶数扇形和奇数扇形的颜色不同
   ctx.fillStyle=that.color[0]
  } else {
   ctx.fillStyle=that.color[1]
  }
  ctx.fill()
  ctx.save()
  ctx.beginPath()
  ctx.fontSize=12
  ctx.fillStyle='#000'
  ctx.textAlign='center'
  ctx.textBaseline='middle'
  ctx.translate(that.w1, that.h1);//将原点移至圆形圆心位置
  ctx.rotate((itemsArc * (i + 2)) * Math.PI / 180);//旋转文字,从 i+2 开始,因为扇形是从数学意义上的第四象限第一个开始的,文字目前的位置是在圆心正上方,所以起始位置要将其旋转2个扇形的角度让其与第一个扇形的位置一致。
  ctx.fillText(that.text[i], 0, -(that.h1 * 0.8));
  ctx.restore();//保存绘图上下文,使上一个绘制的扇形保存住。
 }
}
 
 
//跑马灯绘制
lottery.prototype.light=function(){
 var that=this
 var itemsNum=that.itemsNum
 that.lamp++
 if(that.lamp>=2){
  that.lamp=0
 }
 ctx2.beginPath()
 ctx2.arc(that.w2,that.h2,that.w2,0,2*Math.PI)//绘制底色为红色的圆形
 ctx2.fillStyle="#FA7471";
 ctx2.fill()
 for(let i=0;i<that.itemsNum*2;i++){//跑马灯小圆圈比大圆盘等分数量多一倍
  ctx2.save()
  ctx2.beginPath()
  ctx2.translate(that.w2,that.h2)
  ctx2.rotate(30*i*Math.PI/180)
  ctx2.arc(0,that.h2-10,5,0,2*Math.PI)//圆形跑马灯小圆圈
  //跑马灯第一次闪烁时与第二次闪烁时绘制相反的颜色,再配上定时器循环闪烁就可以达到跑马灯一闪一闪的效果了
  if(that.lamp==0){//第一次闪烁时偶数奇数的跑马灯各绘制一种颜色
  if(i%2==0){
   ctx2.fillStyle="#FBF1A9";
  } else {
   ctx2.fillStyle="#fbb936";
  }
  }else {//第二次闪烁时偶数奇数的跑马灯颜色对调
   if (i % 2 == 0) {
    ctx2.fillStyle="#fbb936";
   } else {
    ctx2.fillStyle="#FBF1A9";
   }
  }
  ctx2.fill()
  ctx2.restore()//恢复之前保存的上下文,可以将循环出来的跑马灯都保存下来。没有这一句那么每循环出一个跑马灯则上一个跑马灯绘图将被覆盖,
 }
 }

小程序的代码示例

//事件处理函数
 onLoad: function (e) {
  let that=this
  let itemsArc=360/that.data.itemsNum //获取大转盘每等分的角度
  that.setData({
   itemsArc
  },function () {
   wx.createSelectorQuery().select('#canvas-one').boundingClientRect(function (rect) {
    w1=parseInt(rect.width/2)
    h1=parseInt(rect.height/2)
    that.Items(itemsArc)//每一份扇形的内部绘制
   }).exec()
   mytime=setInterval(that.light,1000)//启动跑马灯定时器
  })
 },
 onReady:function () {
  var that=this
  wx.createSelectorQuery().select('#canvas-bg').boundingClientRect(function (rect) {//监听canvas的宽高
   w2=parseInt(rect.width/2)
   h2=parseInt(rect.height/2)
   that.light()
  }).exec()
 },
 light(){//跑马灯绘制
  let that=this
  let itemsNum=that.data.itemsNum
  lamp++
  if(lamp>=2){
   lamp=0
  }
  ctx2.beginPath()
  ctx2.arc(w2,h2,w2,0,2*Math.PI)//绘制底色为红色的圆形
  ctx2.setFillStyle("#FA7471")
  ctx2.fill()
  for(let i=0;i<itemsNum*2;i++){//跑马灯小圆圈比大圆盘等分数量多一倍
   ctx2.save()
   ctx2.beginPath()
   ctx2.translate(w2,h2)
   ctx2.rotate(30*i*Math.PI/180)
   ctx2.arc(0,w2-10,5,0,2*Math.PI)//绘制圆形跑马灯小圆圈
   //跑马灯第一次闪烁时与第二次闪烁时绘制相反的颜色,再配上定时器循环闪烁就可以达到跑马灯一闪一闪的效果了
   if(lamp==0){//第一次闪烁时偶数奇数的跑马灯各绘制一种颜色
    if(i%2==0){
     ctx2.setFillStyle("#FBF1A9");
    } else {
     ctx2.setFillStyle("#fbb936");
    }
   }else {//第二次闪烁时偶数奇数的跑马灯颜色对调
    if (i % 2 == 0) {
     ctx2.setFillStyle("#fbb936");
    } else {
     ctx2.setFillStyle("#FBF1A9");
    }
   }
   ctx2.fill()
   ctx2.restore()//恢复之前保存的上下文,可以将循环出来的跑马灯都保存下来。没有这一句那么每循环出一个跑马灯则上一个跑马灯绘图将被覆盖,
  }
  ctx2.draw()
 },
 Items(e){
  let that=this
  let itemsArc=e//每一分扇形的角度
  let Num=that.data.itemsNum// 等分数量
  let text=that.data.text// 放文字的数组
  for(let i=0;i<Num;i++){
   ctx.beginPath()
   ctx.moveTo(w1,h1)
   ctx.arc(w1,h1,w1-5,itemsArc * i * Math.PI / 180, (itemsArc + itemsArc * i) * Math.PI / 180)//绘制扇形,注意下一个扇形比上一个扇形多一个itemsArc的角度
   ctx.closePath()
   if (i % 2 == 0) {//绘制偶数扇形和奇数扇形的颜色不同
    ctx.setFillStyle(that.data.color[0])
   } else {
    ctx.setFillStyle(that.data.color[1])
   }
   ctx.fill()
   ctx.save()
   ctx.beginPath()
   ctx.setFontSize(12)
   ctx.setFillStyle('#000')
   ctx.setTextAlign('center')
   ctx.setTextBaseline('middle')
   ctx.translate(w1, h1);//将原点移至圆形圆心位置
   ctx.rotate((itemsArc * (i + 2)) * Math.PI / 180);//旋转文字,从 i+2 开始,因为扇形是从数学意义上的第四象限第一个开始的,文字目前的位置是在圆心正上方,所以起始位置要将其旋转2个扇形的角度让其与第一个扇形的位置一致。
   ctx.fillText(text[i], 0, -(h1 * 0.8));
   ctx.restore();//保存绘图上下文,使上一个绘制的扇形保存住。
  }
  // that.Images();
  ctx.draw(true);//参数为true的时候,保存当前画布的内容,继续绘制
 },

效果图如下

大转盘抽奖小程序版 转盘抽奖网页版

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
Dec 14 Javascript
Node.js模拟浏览器文件上传示例
Mar 26 Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
Oct 25 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
Dec 02 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
Mar 14 Javascript
微信小程序删除处理详解
Aug 16 Javascript
Angular实现的简单定时器功能示例
Dec 28 Javascript
详解ES6 Fetch API HTTP请求实用指南
Nov 14 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
Mar 26 Javascript
javascript json字符串到json对象转义问题
Jan 22 #Javascript
使用JavaScript保存文本文件到本地的两种方法
Jan 22 #Javascript
微信小程序实现九宫格抽奖
Apr 15 #Javascript
200行HTML+JavaScript实现年会抽奖程序
Jan 22 #Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
Jan 22 #Javascript
微信小程序使用map组件实现解析经纬度功能示例
Jan 22 #Javascript
微信小程序全局变量功能与用法详解
Jan 22 #Javascript
You might like
mayfish 数据入库验证代码
2010/04/30 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
解决python爬虫中有中文的url问题
2018/05/11 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
python 对xml解析的示例
2021/02/27 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
小学后勤管理制度
2014/01/14 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
军训口号
2014/06/13 职场文书
家庭贫困证明
2014/09/23 职场文书
防汛通知
2015/04/25 职场文书
JS数组去重详情
2021/11/07 Javascript