文化要点
1、援引了三个jq插件:awardRotate,用来促成更智能化的团团转(插件下载:)。
2、使用canvas标签和呼应的html5 api
进行操作。(canvas中文手册能够查阅

javascrip+HTML5 Canvas绘制转盘抽取奖金,javascriphtml5

事先做过的品种中,有亟待抽取奖金转盘功用的。项目现已竣事一段时间了,也没出现什么样严重的bug,所以今后拎出来分享给大家。

意义必要 1、转盘要雅观,转动作效果果流畅。
2、转盘上供给出示奖品图片,何况奖品是后台读取的照片和名字。
3、转动动画实现后要有相应提醒。
4、获取的奖品具体算法在数据Curry操作,前端只提供最后的作用突显。 

文化要点
1、引用了多少个jq插件:awardRotate,用来落实更智能化的旋转(插件下载:
2、使用canvas标签和呼应的html5 api
进行操作。(canvas汉语手册能够查阅

正文 援引大转盘样式

.lunck_draw_wrap{display:block;width:95%;margin-right:auto;}
 .lunck_draw_wrap .turnplate{display:block;width:106%; position:relative;}
  .lunck_draw_wrap .turnplate canvas.item{left:1px;
  position: relative;
  top:9px;
  width:100%;}
  .lunck_draw_wrap .turnplate img.pointer{ height:37.5%;
  left:34.6%;
  position: absolute;
  top:30%;
  width:31.5%;}

转盘插件所需参数:

var turnplate ={
 restaraunts:[],//大转盘奖品名称
 lucky:[],//奖品内容
 colors:[],//大转盘奖品区块对应背景颜色
 goodsimgArr:[],//奖品图片页面标签
 outsideRadius:175,//大转盘外圆的半径
 textRadius:140,//大转盘奖品位置距离圆心的距离
 insideRadius:65,//大转盘内圆的半径
 startAngle:0,//开始角度
 bRotate:false//false:停止;ture:旋转
 };

 由参数可见,大家供给从服务端获取相应的奖品名称,奖品内容,奖品图片页面标签等音信,再对大转盘举办渲染。
进而大家的第一步操作正是向服务端发送需要获取相应的奖品音讯,并且遍历到生成大转盘所需的数组参数里:

$.each(data.list,function(key, value){
 turnplate.restaraunts.push(value.data0);
 turnplate.lucky.push(value.data1);
 turnplate.goodsimgArr.push(getLuckyImg + value.data4);
 if(key %2==0)
 turnplate.colors.push("#fff");
 else
 turnplate.colors.push("#5fcbd4");
 })

data.list是自个儿获得来的奖品json数据:

[
 {
 "data0":"一等奖",
 "data1":"iphone6s",
 "data2":"0",
 "data3":"0",
 "data4":"201510161406303384.png",
 "data5":"XXXX网络科技",
 "data6":"浙江省衢州市柯城区XXXXX",
 "data7":"0570-XXXXXX"
 },......
 ]

由于客户须求奖品未有“多谢加入”,所以最低奖品也为“优胜奖”,所以在遍历奖品之后,插入有关“优胜奖”的渲染描述就可以:

turnplate.goodsimgArr.push('../images/hongbao.png')
 turnplate.restaraunts.push("优胜奖");
 turnplate.colors.push("#5fcbd4");
 //页面所有元素加载完毕后执行drawRouletteWheel()方法对转盘进行渲染
 preloadimages(turnplate.goodsimgArr).done(function(images){
 drawRouletteWheel();
 });

因为图片加载需求时日,而选择canvas复制图片必要图片加载成功后能力绘制,所以自身利用了preloadimages,让具有奖品图片都加载实现后张开大转盘的渲染专门的学业:

//对奖品图片预加载
 function preloadimages(arr){
 var newimages =[], loadedimages =0
 var postaction =function(){}//此处增加了一个postaction函数
 var arr =(typeof arr !="object")?[arr]: arr
 function imageloadpost(){
 loadedimages++
 if(loadedimages == arr.length){
 postaction(newimages)//加载完成用我们调用postaction函数并将newimages数组做为参数传递进去
 }
 }
 for(var i =0; i < arr.length; i++){
 newimages[i]=newImage()
 newimages[i].src = arr[i]
 newimages[i].onload =function(){
 imageloadpost()
 }
 newimages[i].onerror =function(){
 imageloadpost()
 }
 }
 return{//此处返回一个空白对象的done方法
 done:function(f){
 postaction = f || postaction
 }
 }
 }

绘制转盘代码:

function drawRouletteWheel(){
 var canvas = document.getElementById("wheelcanvas");
 if(canvas.getContext){
 //根据奖品个数计算圆周角度
 var arc =Math.PI /(turnplate.restaraunts.length /2);
 var ctx = canvas.getContext("2d");
 //在给定矩形内清空一个矩形
 ctx.clearRect(0,0,422,422);
 //strokeStyle 属性设置或返回用于笔触的颜色、渐变或模式
 ctx.strokeStyle ="rgba(0,0,0,0)";
 //font 属性设置或返回画布上文本内容的当前字体属性
 ctx.font ='bold 18px Microsoft YaHei';
 for(var i =0; i < turnplate.restaraunts.length; i++){
 //根据当前奖品索引 计算绘制的扇形开始弧度
 var angle = turnplate.startAngle + i * arc;
 //根据奖品参数 绘制扇形填充颜色
 ctx.fillStyle = turnplate.colors[i];
 //开始绘制扇形
 ctx.beginPath();
 //arc(x,y,r,起始角,结束角,绘制方向) 方法创建弧/曲线(用于创建圆或部分圆)
 //绘制大圆
 ctx.arc(212,212, turnplate.outsideRadius, angle, angle + arc,false);
 //绘制小圆
 ctx.arc(212,212, turnplate.insideRadius, angle + arc, angle,true);
 ctx.stroke();
 ctx.fill();
 //锁画布(为了保存之前的画布状态)
 ctx.save();
 //----绘制奖品开始----
 //奖品默认字体颜色
 ctx.fillStyle ="#fff";
 var text = turnplate.restaraunts[i];
 var lukyname = turnplate.lucky[i];
 var line_height =17;
 //translate方法重新映射画布上的 (0,0) 位置
 ctx.translate(212+Math.cos(angle + arc /2)* turnplate.textRadius,212+Math.sin(angle + arc /2)* turnplate.textRadius);
 //rotate方法旋转当前的绘图
 ctx.rotate(angle + arc /2+Math.PI /2);
 //绘制奖品图片
 var img =newImage();
 img.src = turnplate.goodsimgArr[i];
 ctx.drawImage(img,-17,35);
 //由于设计的转盘色块是交错的,所以这样可以实现相邻奖品区域字体颜色不同
 if(i %2==0){
 ctx.fillStyle ="#f7452f";
 }
 //将字体绘制在对应坐标
 ctx.fillText(text,-ctx.measureText(text).width /2,0);
 //设置字体
 ctx.font =' 14px Microsoft YaHei';
 //绘制奖品名称
 if(text !="优胜奖"){
 ctx.fillText(lukyname,-ctx.measureText(lukyname).width /2,25);
 }else{
 ctx.fillText("优麦币",-ctx.measureText("优麦币").width /2,25);
 }
 //把当前画布返回(插入)到上一个save()状态之前
 ctx.restore();
 ctx.save();
 //----绘制奖品结束----
 }
 }
 }

每一步基本上都有注释,对于canvas方法有不理解的可以百度,可能查询自身下面分享的华语手册。
html代码为:

<divclass="lunck_draw_wrap">
 <divclass="turnplate"style=" background-size:100%100%;">
 <canvasclass="item"id="wheelcanvas"width="422px"height="422px"></canvas>
 <imgclass="pointer"style="top:0px; left:0px; width:100%; height:100%;"src="../images/chouzhang12.png"/>
 <imgclass="pointer"src="../images/hianji%20.png"/>
 </div>
 </div>

 效果图:

图片 1

点击事件实践代码:

$('.lunck_draw_wrap').delegate("img.pointer","click",function(){
 if(turnplate.bRotate)return;
 turnplate.bRotate =!turnplate.bRotate;
 $.getJSON("../AJAX/lottery.ashx","",function(data){
 //1090系统配置错误,1091用户未登陆或用户数据异常,1092用户剩余积分不足,1093未中奖
 hideInput("code",data.code)
 if(data.code.toString()=="1090"){
 iosalert("系统配置错误")
 }elseif(data.code.toString()=="1091"){
 iosalert("用户未登陆或用户数据异常")
 }elseif(data.code.toString()=="1092"){
 iosalert("用户剩余积分不足")
 }elseif(data.code.toString()=="1094"){
 iosalert("超过每日抽奖次数")
 }
 else{
 var upoint =0;
 upoint = parseInt($("#uPoint").html())- parseInt($("#sPoint").html());
 $("#uPoint").html(upoint);
 if(data.isWin =='true'){
 item = getArrayIndex(turnplate.restaraunts, data.name);
 rotateFn(item +1,"恭喜获得,"+ turnplate.restaraunts[item]);
 }
 else{
 rotateFn(0,"恭喜获得优胜奖!");
 }
 }
 })
 });

上面的代码达成了大半的逻辑,还索要两个筋斗转盘的法门来响应服务端传过来的结果:

//旋转转盘 item:奖品位置; txt:提示语;
 var rotateFn =function(item, txt){
 //根据传进来的奖品序号 计算相应的弧度
 var angles = item *(360/ turnplate.restaraunts.length)-(360/(turnplate.restaraunts.length *2));
 if(angles <270){
 angles =270- angles;
 }else{
 angles =360- angles +270;
 }
 //强制停止转盘的转动
 $('#wheelcanvas').stopRotate();
 //调用转动方法,设置转动所需参数和回调函数
 $('#wheelcanvas').rotate({
 //起始角度
 angle:0,
 //转动角度 +1800是为了多转几圈
 animateTo: angles +1800,
 duration:8000,
 callback:function(){
 iosSuccess(txt);
 turnplate.bRotate =!turnplate.bRotate;
 if($("#code").val()!="1093"){
 delayLoad(getHttpPrefix +"graphicdetails.html?lukyid="+ $("#code").val())
 }
 }
 });
 };

好了 首要的作用代码都已享受甘休了,还有些工具方法不明白的,能够留言
作者会补充进去的。
总结 canvas是html5很有力的一张金牌,能够实现广大炫丽标功用,希望本文能够帮到一些正值攻读应用canvas的情大家。

Canvas绘制转盘抽取奖品,javascriphtml5
从前做过的品种中,有须求抽取奖品转盘功能的。项目曾经完工一段时间了,也没出现什么样严重的…

4.主要的css代码

你大概感兴趣的稿子:

  • JS+HTML5
    Canvas完毕轻便的写字板功能示例
  • html5+javascript制作简便画板附图
  • javascript结合html5
    canvas达成(可调画笔颜料/粗细/橡皮)的涂鸦板
  • JS+html5
    canvas完成的简练绘制折线图效果示例
  • js+html5兑现canvas绘制圆形图案的章程
  • js+html5完结canvas绘制镂空字体文本的艺术
  • js+html5绘制图片到canvas的格局
  • js HTML5
    Canvas绘制转盘抽取奖金
  • javascript+HTML5
    Canvas绘制转盘抽取奖品
  • JavaScript+html5
    canvas绘制的小丑效果
  • 原生JS+HTML5落到实处的可调度写字板作用示例

功能须要 1、转盘要注重,转动作效果果流畅。
2、转盘上要求突显奖品图片,并且奖品是后台读取的照片和名字。
3、转动动画达成后要有相应提醒。
4、获取的奖品具体算法在数据Curry操作,前端只提供最后的效能突显。 

 <body>
  <div class="content">
    <div class="wheel">
      <canvas class="item" id="wheelCanvas" width="422px" height="422px"></canvas>
      <img class="pointer" src="images/wheel-pointer.png"/>
    </div>
  </div>
  <div class="tips" >
    jason
  </div>
</body>
</html>

以上正是本文的全体内容,希望对我们的就学抱有协助。

//对奖品图片预加载
 function preloadimages(arr){
 var newimages =[], loadedimages =0
 var postaction =function(){}//此处增加了一个postaction函数
 var arr =(typeof arr !="object")?[arr]: arr
 function imageloadpost(){
 loadedimages++
 if(loadedimages == arr.length){
 postaction(newimages)//加载完成用我们调用postaction函数并将newimages数组做为参数传递进去
 }
 }
 for(var i =0; i < arr.length; i++){
 newimages[i]=newImage()
 newimages[i].src = arr[i]
 newimages[i].onload =function(){
 imageloadpost()
 }
 newimages[i].onerror =function(){
 imageloadpost()
 }
 }
 return{//此处返回一个空白对象的done方法
 done:function(f){
 postaction = f || postaction
 }
 }
 }

 图片 2

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>DEMO6:自定义画板</title>
</head>
<body>
<canvas id="canvas" width="600" height="300">
  浏览器不支持canvas  <!-- 如果不支持会显示这段文字 -->
</canvas>
<br/>
<button style="width:80px;background-color:yellow;" onclick='linecolor="yellow";'>YELLOW</button>
<button style="width:80px ;background-color:red;" onclick='linecolor="red";'>RED</button>
<button style="width:80px ;background-color:blue;" onclick='linecolor="blue";'>BLUE</button>
<button style="width:80px ;background-color:green;" onclick='linecolor="green";'>GREEN</button>
<button style="width:80px ;background-color:white;" onclick='linecolor="white";'>WHITE</button>
<button style="width:80px ;background-color:black;" onclick='linecolor="black";'>BLACK</button>
<br/>

<button style="width: 80px;background-color: white;" onclick="linw=4;">4PX</button>
<button style="width: 80px;background-color: white;" onclick="linw=8;">8PX</button>
<button style="width: 80px;background-color: white;" onclick="linw=16;">16PX</button>
<br/>

<button style="width: 80px;background-color: white;" onclick="copyimage();">EXPORT</button>

<br/>
<img src="" id="image_png" width="600px" height="300px">
<br/>

<script type="text/javascript">
  var canvas = document.getElementById('canvas'); //获取标签
  var ctx = canvas.getContext("2d"); 

  var fillStyle = "black";
  ctx.fillRect(0,0,600,300);
  var onoff = false; //按下标记
  var oldx = -10;
  var oldy = -10;
  //设置颜色
  var linecolor = "white";
  var linw = 4;
  canvas.addEventListener("mousemove",draw,true); //鼠标移动事件
  canvas.addEventListener("mousedown",down,false); //鼠标按下事件
  canvas.addEventListener("mouseup",up,false); //鼠标弹起事件
  function down(event){
    onoff = true;
    oldx = event.pageX - 10;
    oldy = event.pageY - 10;
  }
  function up(){
    onoff = false;
  }
  function draw(event){
    if (onoff==true) {
      var newx = event.pageX - 10;
      var newy = event.pageY - 10
      ctx.beginPath();
      ctx.moveTo(oldx,oldy);
      ctx.lineTo(newx,newy);
      ctx.strokeStyle = linecolor;
      ctx.lineWidth = linw;
      ctx.lineCap = "round";
      ctx.stroke();

      oldx = newx;
      oldy = newy;
    }
  }
  function copyimage(event)
  {
    var img_png_src = canvas.toDataURL("image/png"); //将画板保存为图片格式的函数
    document.getElementById("image_png").src = img_png_src;
  }

  </script> 
</body>
</html>

下面的代码达成了差不离的逻辑,还亟需贰个旋转转盘的不二等秘书技来响应服务端传过来的结果:

1.兑现的中央职能

正文实例为大家分享了HTML5
Canvas达成的一个画板代码,供大家仿效,具体内容如下

//旋转转盘 item:奖品位置; txt:提示语;
 var rotateFn =function(item, txt){
 //根据传进来的奖品序号 计算相应的弧度
 var angles = item *(360/ turnplate.restaraunts.length)-(360/(turnplate.restaraunts.length *2));
 if(angles <270){
 angles =270- angles;
 }else{
 angles =360- angles +270;
 }
 //强制停止转盘的转动
 $('#wheelcanvas').stopRotate();
 //调用转动方法,设置转动所需参数和回调函数
 $('#wheelcanvas').rotate({
 //起始角度
 angle:0,
 //转动角度 +1800是为了多转几圈
 animateTo: angles +1800,
 duration:8000,
 callback:function(){
 iosSuccess(txt);
 turnplate.bRotate =!turnplate.bRotate;
 if($("#code").val()!="1093"){
 delayLoad(getHttpPrefix +"graphicdetails.html?lukyid="+ $("#code").val())
 }
 }
 });
 };

正文实例为我们大快朵颐了js转盘抽取奖品的切切实实代码,供我们参谋,具体内容如下

图片 3

上述就是本文的全体内容,希望对大家的就学抱有扶助,也指望我们多多辅助脚本之家。

点击事件实行代码:

最后
那玩意和IOS里面的Quartz2D手艺差非常的少同样….
详见代码>>>>点击下载.rar) 

admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注