最近项目上写了一个签到页面,放在h5、ios和安卓中一起用 ,其中有一个功能是抽奖大转盘,这是一个很常用的功能,现在总结记录一下:

效果gif

需求

1、每种奖品的中奖概率由后台确定,非随机。

2、页面上大转盘中的奖品图品和名称有后台提供,灵活非静态。

技术栈

1、HTML5 Canvas

2、引用Jquery插件jQueryRotate.js

踩坑和注意

1、绘制后的画布文字模糊,画布设置尺寸后,css将其设置为一半大小,如此就相当于画了一张200*400的图片,然后设置他显示成100*200的大小,这样一来就变得清晰了。需要注意的是,这样将画布放大之后,绘制的过程中对应的那些坐标,长度等等都要相应的放大

2、canvas加载奖品图片,全都堆叠在左上角,原因是绘制画布时图片还没加载出来,需要使用onload解决

//注意需要等图片加载完成后绘制

window.onload = function() {

drawWheelCanvas();

};

3、ios的Webview ajax不兼容,因为当时是本地作为服务器测试的,部署在服务器上就行了。参考

4、save()与restore()区别

save表示保存save函数之前的状态;restore表示获取save保存的状态

5、canvas是从水平位置开始绘制的

6、实现转盘四周闪烁效果,其实就是两张图片的切换,如图

两张图片的切换

四周闪烁效果.gif

具体代码

第一步:HTML布局

第二部:绘制大转盘

做一些画布的基础设置,此处预先假设抽奖奖项为6项

//获取canvas画布

var canvas = document.getElementById("wheelCanvas");

var ctx = canvas.getContext("2d");

var canvasW = canvas.width; // 画板的高度

var canvasH = canvas.height; // 画板的宽度

//计算每个奖项所占角度数

var baseAngle = Math.PI * 2 / 6;

ctx.clearRect(0,0,canvasW,canvasH);//去掉背景默认的黑色

console.log(canvasW);

ctx.strokeStyle = "#199301"; //设置画图线的颜色

ctx.font = '26px Microsoft YaHei';//设置字号字体

循环绘制6个60度的扇形,canvas是从水平位置开始绘制的,效果如图

colors = ["#AE3EFF","#4D3FFF","#FC262C","#3A8BFF","#EE7602","#FE339F"];

for(var index = 0; index < 6; index++) {

var angle = index * baseAngle;

ctx.fillStyle = colors[index];//设置每个扇形区域的颜色

ctx.beginPath();//开始绘制

ctx.arc(canvasW * 0.5, canvasH * 0.5, 170, angle, angle + baseAngle, false);

ctx.arc(canvasW * 0.5, canvasH * 0.5, 68, angle + baseAngle, angle, true);

//context.arc(x,y,r,sAngle,eAngle,counterclockwise);创建弧/曲线

ctx.stroke();//开始链线

ctx.fill();//填充颜色

ctx.save();//保存当前环境的状态

}

循环绘制6个60度的扇形,并放上文字图片

colors = ["#AE3EFF","#4D3FFF","#FC262C","#3A8BFF","#EE7602","#FE339F"];

rewardUrl =[]//从服务器请求回来的imgurl

prizeId =[]//从服务器请求回来的奖项

// 图片信息

var imgUrl1 = new Image();

imgUrl1.src = turnWheel.rewardUrl[0];

var imgUrl2 = new Image();

imgUrl2.src = turnWheel.rewardUrl[1];

var imgUrl3 = new Image();

imgUrl3.src = turnWheel.rewardUrl[2];

var imgUrl4 = new Image();

imgUrl4.src = turnWheel.rewardUrl[3];

var imgUrl5 = new Image();

imgUrl5.src = turnWheel.rewardUrl[4];

var imgUrl6 = new Image();

imgUrl6.src = turnWheel.rewardUrl[5];

//注意需要等图片加载完成后绘制

window.onload = function() {

drawWheelCanvas();

};

for(var index = 0; index < 6; index++) {

var angle = index * baseAngle;

ctx.fillStyle = colors[index];//设置每个扇形区域的颜色

ctx.beginPath();//开始绘制

ctx.arc(canvasW * 0.5, canvasH * 0.5, 170, angle, angle + baseAngle, false);

ctx.arc(canvasW * 0.5, canvasH * 0.5, 68, angle + baseAngle, angle, true);

//context.arc(x,y,r,sAngle,eAngle,counterclockwise);创建弧/曲线

ctx.stroke();//开始链线

ctx.fill();//填充颜色

ctx.save();//保存当前环境的状态

ctx.fillStyle = "#fff000";

var rewardName = prizeId[index];

var line_height = 24;

// translate方法重新映射画布上的 (0,0) 位置

var translateX = canvasW * 0.5 + Math.cos(angle + baseAngle / 2) * turnWheel.textRadius;

var translateY = canvasH * 0.5 + Math.sin(angle + baseAngle / 2) * turnWheel.textRadius;

ctx.translate(translateX, translateY);

// rotate方法旋转当前的绘图,因为文字适合当前扇形中心线垂直的!

// angle,当前扇形自身旋转的角度 + baseAngle / 2 中心线多旋转的角度 + 垂直的角度90°

ctx.rotate(angle + baseAngle / 2 + Math.PI / 2);

//设置文本位置,居中显示

ctx.fillText(rewardName, -ctx.measureText(rewardName).width / 2, 100);

//添加对应图标

if(index == 0){

ctx.drawImage(imgUrl1,-35,0,60,60);

}else if(index == 1){

ctx.drawImage(imgUrl2,-35,0,60,60);

}else if(index == 2){

ctx.drawImage(imgUrl3,-35,0,60,60);

}else if(index == 3){

ctx.drawImage(imgUrl4,-35,0,60,60);

}else if(index == 4){

ctx.drawImage(imgUrl5,-35,0,60,60);

}else{

ctx.drawImage(imgUrl6,-35,0,60,60);

}

ctx.restore(); //很关键,还原画板的状态到上一个save()状态之前

}

第三部:设置旋转转盘配置

//旋转转盘 item:奖品序号,从0开始的; txt:提示语 ,count 奖品的总数量;

var rotateFunc = function(item, tip, count) {

// 应该旋转的角度,旋转插件角度参数是角度制。

var baseAngle = 360 / count;

// 旋转角度 == 270°(当前第一个角度和指针位置的偏移量) - 奖品的位置 * 每块所占的角度 - 每块所占的角度的一半(指针指向区域的中间)

angles = 360 * 3 / 4 - (item * baseAngle) - baseAngle / 2; // 因为第一个奖品是从0°开始的,即水平向右方向

$('#wheelCanvas').stopRotate();

// 注意,jqueryrotate 插件传递的角度不是弧度制。

// 哪个标签调用方法,旋转哪个控件

$('#wheelCanvas').rotate({

angle: 0,

animateTo: angles + 360 * 5, // 这里多旋转了5圈,圈数越多,转的越快

duration: 8000,

callback: function() { // 回调

//弹出中奖提示

turnWheel.bRotate = !turnWheel.bRotate;

}

});

};

第四部:点击抽奖事件

此处需要做的是,在用户点击时向后台发送请求,接收中奖信息,开始旋转...

// 抽取按钮按钮点击触发事件

$('.pointer').click(function() {

// 正在转动,直接返回

if(turnWheel.bRotate) return;

turnWheel.bRotate = !turnWheel.bRotate;

var count = turnWheel.rewardNames.length;

$.ajax({

type: "POST",

url: "./drawPrize.htm",

data: {

customerId: $(".customerId").val()

},

async: false,

dataType: "json", // 返回数据类型

success: function(data) {

console.log(data);

if(data.type == 1) { //积分不足

} else if(data.type == 2) { //抽奖次数已经用完

} else { //抽奖次数已经用完

turnWheel.prizeId.forEach(function(currentValue, index) {

if(currentValue == data.prize.id) {

var item = index;

$(".award-warp .content").html(data.prize.name);

// 开始抽奖

rotateFunc(item, turnWheel.rewardNames[item], count);

}

})

}

},

error: function(data) {

console.log("网络错误,请检查您的网络设置!");

}

});

});

js+php+大转盘,H5 Canvas抽奖大转盘代码实现及总结相关推荐

  1. canvas抽奖插件大转盘和九宫格

    下载地址 两款canvas抽奖插件包含大转盘和九宫格// 大转盘抽奖 let luckyWheel = new LuckyCanvas.LuckyWheel({ el: "#my-lucky ...

  2. h5大转盘 php,HTML5 canvas实现中奖转盘的实例代码

    本篇文章给大家带来的内容是关于HTML5 canvas实现中奖转盘的实例代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 最近在学canvas做动画,于是就写个转盘练下手. 上个简 ...

  3. vue幸运抽奖大转盘的丑绝实现

    自己通过canvas+vue(vue不是必备的可以)实现的一个抽奖转盘,重点在实现逻辑,所以样式丑绝. 基本效果图,中间指针可以替换为图片 数据格式 转盘的分块由传入的数组长度确定,分为4,6,8块还 ...

  4. css3抽奖转盘,从零制作CSS3抽奖大转盘

    今天的任务是做一个纯CSS3的还算比较漂亮的抽奖大转盘,也就是下图效果. 我只说思路和重要的CSS3代码. Paste_Image.png 外盘 外盘是指有彩灯的深橙色圆环,以及圆环的外边线. 外盘设 ...

  5. 微信小程序独家秘笈之抽奖大转盘

    代码地址如下: http://www.demodashi.com/demo/14209.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  6. 用html实现抽奖大转盘,【项目实战】用CSS实现一个抽奖转盘(附详细代码+思路)...

    原标题:[项目实战]用CSS实现一个抽奖转盘(附详细代码+思路) 效果 基本是用CSS实现的,没有用图片,加一丢丢JS. 完全没有考虑兼容性. 首先画一个转盘 < htmllang= " ...

  7. 大转盘H5游戏的优点

    不论是线上还是线下的活动方案和模式越来越多,不过大转盘抽奖依旧是使用率最高的游戏模式.越来越多的电商.银行等主流行业采用大转盘H5游戏进行抽奖,得到了用户们的广泛青睐,那么,到底大转盘游戏到底有何种魅 ...

  8. 大转盘H5模板的游戏优点

    不论是线上还是线下的营销活动方案和模式越来越多,不过大转盘抽奖依旧是使用率最高的营销游戏模式.越来越多的电商.银行等主流行业采用大转盘H5游戏进行抽奖促销,得到了用户们的广泛青睐,那么,到底大转盘游戏 ...

  9. 自学小程序,我教你呀(三)实现大转盘 仿天猫抽奖 跑马灯效果

    往期精选: 自学小程序,我教你呀(一)简单倒计时 自学小程序,我教你呀(二)小程序实现电商秒杀倒计时效果 基本实现功能 1,小程序仿天猫超市抽奖大转盘 2,跑马灯效果 3,开始抽奖,抽奖完成后有弹窗 ...

  10. 微信小程序源码大集004---小程序实现大转盘 仿天猫抽奖 跑马灯效果(有图有源码)

    10天零基础入门微信小程序开发,只讲干货,实战入门,10天开发属于自己的上线小程序. 10天零基础入门小程序系列教程 基本实现功能 1,小程序仿天猫超市抽奖大转盘 2,跑马灯效果 3,开始抽奖,抽奖完 ...

最新文章

  1. python可以做测试软件吗_Python如何给你的程序做性能测试
  2. C++中类的继承方式的区别以及private public protected 范围
  3. 克莱姆V(克莱姆相关系数、克莱姆关联系数、独立系数)
  4. 浅谈5G机房配套那些事
  5. HTML+CSS+JavaScript复习笔记持更(二)——列表篇
  6. 圆桌的项目Alpha冲刺(团队)
  7. 控制台服务编写 Linux,一步步搭建ubuntu server console(控制台,字符模式)开发环境...
  8. 数据库流行度7月排行榜:Oracle 和 MySQL 暴跌创历史新低
  9. java innodb存储引擎_MySQL InnoDB存储引擎的事务隔离级别
  10. 银联接口(注意项备忘)
  11. maven本地仓库中存在jar包,但编译不成功,显示jar包不存在
  12. mysql中url的格式_MySQL JDBC URL中的格式以及参数介绍
  13. 啦啦外卖UNIAPP(4.0)源码商家+骑手
  14. ati.c ATI顯卡開發源代碼
  15. CoAP协议学习笔记 3.2 CoAP协议翻译 DTLS加密
  16. Wekan 部署文档
  17. java茌首字母_获取输入字符的首字母(中文为拼音首字母)
  18. ucdavis计算机科学专业,加州大学戴维斯分校有哪些专业处于世界顶尖水平?
  19. MAXIMO学习笔记
  20. 粗糙集的概念和一些例子

热门文章

  1. 问的书写规则是什么意思_水的书写规则是什么
  2. Chrome浏览器使用“油猴插件”观看巨人(免疫港澳台限制)
  3. 医学知识-骨密度以及骨密度测量
  4. 黑马程序员——双列集合、泛型 笔记第十一篇
  5. Laravel第二章
  6. 计算机系固态硬盘机械硬盘,固态硬盘和机械硬盘可以在一起使用吗?
  7. 嵌入式单片机基础篇(五)之stm32F1以及51单片机时钟详解
  8. xml文件怎么转换成wps_word文档怎样转换成xml 怎么将XML文档转成WORD文档
  9. RGB颜色对照表(数值+英文,Markdown可用)
  10. 免费pdf转换成jpg图片方法