今天整理了下以前写的小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

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

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

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

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的时候,保存当前画布的内容,继续绘制

},

效果图如下

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

转盘抽奖小程序java_大转盘抽奖小程序版 转盘抽奖网页版相关推荐

  1. 微信小程序期末大作业 中草药小程序 药海拾遗

    微信小程序期末大作业 中草药小程序 药海拾遗 小程序详情如下:(下载链接在文末) 学习社区可以自己添加内容 点我下载资源 https://download.csdn.net/download/weix ...

  2. 小眼睛适合大框还是小框眼镜_大镜框还是小镜框?切记适合的才是最好的!

    如果要问一个人的眼睛大一些好?还是小一些好?相信大家都会异口同声的回答大眼睛!可是如果将这个问题中的一个字做改动,变为"大眼镜.小眼镜哪个更好",您还会不假思索理所当然的回答&qu ...

  3. 小眼睛适合大框还是小框眼镜_北京潘家园眼镜城良心商家推荐

    去潘家园配眼镜,水深,但是性价比真的高.仔细鉴别还是很划算的,我在潘家园眼镜城转了1天,综合对比,选择了很有名的润智配镜. 以下配镜经验: 第一,验光:一定找个有自己验光师的眼镜店!集中验光,仓促验不 ...

  4. 小眼睛适合大框还是小框眼镜_小眼睛合适什么眼镜框 这个禁忌千万不要犯

    小眼睛适合什么眼镜框 许多天生眼睛偏小的人,都会想尽方法来让自己的眼睛看起来更大,而佩戴眼镜就是其中对比多见的方式.但佩戴眼镜也是需要讲究诀窍的,那么,小眼睛的人应该如何挑选眼镜呢? 对于现代的年轻男 ...

  5. 小眼睛适合大框还是小框眼镜_【图】小眼睛适合什么眼镜框 这个禁忌千万不要犯_小眼睛_伊秀服饰网|yxlady.com...

    很多天生眼睛偏小的人,都会想尽办法来让自己的眼睛看起来更大,而佩戴眼镜就是其中比较常见的方式.但佩戴眼镜也是需要讲究诀窍的,那么,小眼睛的人应该如何挑选眼镜呢? 对于现代的年轻男女来说,很多时候佩戴眼 ...

  6. 计算机主板 大 小,电脑主板选大的还是小的比较好?

    电脑主板的规格主要分为E-ATX.ATX.Micro-ATX和Mini-ITX等,最常见的就是ATX和Micro-ATX主板,也就是通常所说的大板和小板.其实从性能来讲,大板和小板并没有太大差别,但大 ...

  7. 小眼睛适合大框还是小框眼镜_近视眼镜大框好还是小框好?

    大框眼镜一直备受明星的青睐,稍微关注时尚的都知道,时尚女王范冰冰常常用黑色大框眼镜为自己的装扮"润色",不仅是明星,大框眼镜已成为潮人必备,不仅时尚,它还实用,某些女孩子选择大框眼 ...

  8. 小眼睛适合大框还是小框眼镜_【图】小眼睛适合什么眼镜框呢 你选对了吗_小眼睛_伊秀美容网|yxlady.com...

    如今,科技也发展的越来越快了,虽然带给了人们很多的好处,但也给人们带来不小的压力,人们的生活节奏变得很快,每一天还有长时间的面对着电脑,对眼睛造成了不好的影响. 现如今社会上的竞争越来越激烈,人们的生 ...

  9. 小程序统一服务消息_小程序客服消息接入微信教程

    很多商家在咨询小程序,都会咨询手机上能不能接待客户,当然可以,但需要开通客服助手小程序,下面就和大家分享一下小程序客服消息接入微信教程? 基本流程:客服入口-添加绑定客服微信号-用绑定客服微信号扫码- ...

  10. 大趋势和小趋势的辩证关系(一)

    在论述这个命题前,定义本博认可的有关趋势的指标. 60.120和250日线代表大趋势的K线: 30日线作为大趋势和小趋势的分界: 20.10.5日线及60分钟.30分钟.15分钟和5分钟K线的各单位组 ...

最新文章

  1. 2018年4月26日笔记
  2. 【计算理论】计算复杂性 ( coNP 问题 | coNP 完全 | P、NP、coNP 相互关系 )
  3. java 清空jframe_java – 在新游戏中清除我的JFrame和JPanel
  4. 根据redis自增生成全局唯一订单id
  5. NHibernate 3.0在PetShop 3层架构中的应用 系列
  6. Codeforces940(A-F)
  7. [tp3.2.1]数据模型 - 简单的模型连接
  8. [react] react父子组件如何通信?
  9. VIM使用系列之一——配置VIM下编程和代码阅读环境
  10. Activiti工作流引擎的使用
  11. java通过POI技术将html转成word
  12. 剑指Offer-- 二维数组中的查找
  13. 时隔两年,盘点ECCV 2018影响力最大的20篇论文
  14. 某东商城获取eid和fp参数方法
  15. SSH 无法启动的原因分析及解决方法
  16. 《代码大全》学习摘要(五)软件构建中的设计(下)
  17. glut相关函数说明
  18. 【软件工程】-项目开发计划
  19. 浏览器保存图片时,将jfif改为jpg格式
  20. 基于myscript.js的web手写板(支持中文识别)

热门文章

  1. python交通流预测算法_一种高速公路交通流预测方法与流程
  2. linux环境下hadoop版本的升级、更换
  3. 不确定性环境下的智慧城市顶层设计
  4. 错误码 0x8007007b 解决
  5. jetson nano opencv 打开 CSI摄像头_opencv-python图形图像处理入门基础知识
  6. 如何安装ioncube扩展
  7. 数学笔记30——无穷级数和收敛判定
  8. 计算混响时间的意义_大盘点:混响时间常用的几种计算公式
  9. mysql创建表代码_MySQL------代码建表
  10. 网站制作工具简介_实用又免费的短视频制作工具及短视频素材源网站