中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

javascrip+HTML5 Canvas繪制轉盤抽獎
來源:易賢網 閱讀:1457 次 日期:2016-07-08 09:54:03
溫馨提示:易賢網小編為您整理了“javascrip+HTML5 Canvas繪制轉盤抽獎”,方便廣大網友查閱!

這篇文章主要介紹了javascrip+HTML5 Canvas繪制轉盤抽獎的相關資料,需要的朋友可以參考下

之前做過的項目中,有需要抽獎轉盤功能的。項目已經完工一段時間了,也沒出現什么嚴重的bug,所以現在拎出來分享給大家。

功能需求

1、轉盤要美觀,轉動效果流暢。

2、轉盤上需要顯示獎品圖片,并且獎品是后臺讀取的照片和名字。

3、轉動動畫完成后要有相應提示。

4、獲取的獎品具體算法在數據庫里操作,前端只提供最后的效果展示。 

知識要點

1、引用了一個jq插件:awardRotate,用來實現更智能化的轉動(插件下載:http://www.jqcool.net/jquery-jqueryrotate.html)。

2、使用canvas標簽和對應的html5 api 進行操作。(canvas中文手冊可以查看http://javascript.ruanyifeng.com/htmlapi/canvas.html

正文

引用大轉盤樣式

.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 .png"/>

 </div>

 </div>

 效果圖:

名單

點擊事件執行代碼:

$('.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的朋友們。

更多信息請查看網絡編程
易賢網手機網站地址:javascrip+HTML5 Canvas繪制轉盤抽獎
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久久精品国产99久久精品芒果| 亚洲福利国产| 亚洲国产精品va在线看黑人动漫| 欧美电影专区| 狂野欧美性猛交xxxx巴西| 午夜电影亚洲| 亚洲午夜女主播在线直播| 黄色一区二区三区| 国产亚洲午夜| 在线观看国产一区二区| 伊人夜夜躁av伊人久久| 国产综合久久久久久鬼色| 国产精品日韩精品欧美在线| 久久亚洲精品一区二区| 久久综合九色综合网站| 欧美人成网站| 国产精品盗摄一区二区三区| 国产欧美日韩亚洲一区二区三区| 国产精品视频久久一区| 国产欧美一区二区在线观看| 国产精品久久久亚洲一区| 国产日韩欧美不卡| 亚洲国产福利在线| 午夜国产精品视频| 欧美日韩视频在线一区二区 | 国产精品久久久久毛片软件| 男人的天堂成人在线| 欧美日韩亚洲综合| 精品福利av| 亚洲精选视频免费看| 午夜日韩在线| 欧美激情综合网| 韩国成人理伦片免费播放| 一区二区毛片| 欧美久久久久久久| 一本大道av伊人久久综合| 欧美a级一区二区| 亚洲片在线资源| 国产一区二区三区高清在线观看 | 久久久久久久综合日本| 先锋影院在线亚洲| 亚洲人线精品午夜| 欧美精品九九99久久| 亚洲一区二区精品| 亚洲欧洲日本一区二区三区| 一区二区三区 在线观看视频| 亚洲人成网站777色婷婷| 国产日产欧产精品推荐色 | 国产日韩在线不卡| 韩国一区二区三区美女美女秀| 日韩亚洲欧美在线观看| 欧美成人午夜| 亚洲欧洲精品一区二区三区不卡 | 欧美色偷偷大香| 一区二区av| 国产欧美综合在线| 欧美成人精品不卡视频在线观看 | 黄色工厂这里只有精品| 欧美成年人视频| 亚洲线精品一区二区三区八戒| 国产日韩精品视频一区| 欧美黄色一区| 小黄鸭精品aⅴ导航网站入口| 国产亚洲制服色| 欧美另类极品videosbest最新版本| 亚洲视频大全| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产精品免费电影| 久久久国际精品| 一本久久综合亚洲鲁鲁| 在线国产精品播放| 国产一区二区三区在线观看精品| 老司机成人在线视频| 午夜电影亚洲| 欧美一区二区视频网站| 亚洲女性裸体视频| 亚洲伊人久久综合| 日韩视频在线一区二区三区| 国内精品久久久久影院 日本资源| 欧美三级在线视频| 国产精品毛片高清在线完整版| 猫咪成人在线观看| 美国十次成人| 国产精品成人一区二区三区夜夜夜| 欧美精品乱码久久久久久按摩| 欧美高清在线| 国产精品一区在线播放| 国产精品视频不卡| 国产在线视频欧美| 亚洲毛片在线| 久久精品国产免费看久久精品| 久久九九精品| 欧美日韩一区二区免费视频| 国产精品入口日韩视频大尺度| 国产亚洲精品久久飘花| 亚洲国产综合在线| 欧美在线免费| 国产视频亚洲精品| 亚洲天堂成人在线观看| 嫩模写真一区二区三区三州| 国产农村妇女毛片精品久久莱园子| 亚洲国产另类久久久精品极度| 欧美一区二区三区男人的天堂| 欧美午夜视频| 亚洲伊人一本大道中文字幕| 欧美福利电影网| 伊人夜夜躁av伊人久久| 久久精品视频亚洲| 亚洲精品美女免费| 好看的日韩视频| 在线视频欧美日韩| 亚洲视频在线播放| 影音先锋亚洲精品| 在线观看国产精品淫| 欧美视频国产精品| 国产精品蜜臀在线观看| 欧美专区日韩视频| 国产一区二区毛片| 欧美精品一级| 欧美激情第一页xxx| 91久久久久久| 亚洲午夜免费视频| 激情91久久| 亚洲国产裸拍裸体视频在线观看乱了| 午夜一区二区三区不卡视频| 欧美黑人国产人伦爽爽爽| 亚洲高清视频在线观看| 欧美在线一区二区| 国产精品网曝门| 亚洲专区在线| 亚洲伊人久久综合| 久色成人在线| 国产午夜久久久久| 亚洲日本免费电影| 亚洲欧美成人精品| 国内久久精品| 国产精品一卡二| 欧美日韩日韩| 久久综合九色综合网站| 在线综合视频| 亚洲视频一起| 欧美视频你懂的| 欧美日韩亚洲综合一区| 亚洲男人的天堂在线aⅴ视频| 免费成人毛片| 99av国产精品欲麻豆| 黄色精品在线看| 麻豆91精品91久久久的内涵| 国产精品视频男人的天堂| 正在播放欧美一区| 亚洲精品乱码久久久久| 亚洲视频在线二区| 国产一区二区按摩在线观看| 亚洲欧美春色| 狠狠噜噜久久| 欧美日韩在线播放三区四区| 日韩一级成人av| 激情久久一区| 国产欧美日本| 欧美成人精品h版在线观看| 亚洲一二三级电影| 黄色精品一区二区| 国产精品美女久久久浪潮软件| 亚洲综合成人在线| 性久久久久久久| 亚洲午夜羞羞片| 亚洲伦理在线免费看| 亚洲电影成人| 午夜精品久久久久久久99水蜜桃 | 亚洲伊人伊色伊影伊综合网| 在线看视频不卡| 亚洲人成77777在线观看网| 国产精品高清一区二区三区| 欧美xx视频| 麻豆久久婷婷| 久久久久久久性| 亚洲激情视频| 亚洲一区二区视频| 午夜宅男久久久| 久久在线精品| 国产精品色婷婷| 国产精品区免费视频| 久久综合伊人77777麻豆| 亚洲电影毛片| 亚洲综合视频1区| 美国成人直播| 小黄鸭精品aⅴ导航网站入口| 欧美日韩免费一区二区三区| 禁久久精品乱码| 亚洲六月丁香色婷婷综合久久| 国产一区二区高清| 在线天堂一区av电影| 欧美性一二三区| 欧美一区二区三区免费大片| 亚洲国产日日夜夜| 欧美日韩免费在线| 欧美片在线播放| 欧美日韩一区二区免费在线观看| 亚洲精品男同| 国产自产2019最新不卡|