課程
/前端開發(fā)
/Html5
/炫麗的倒計時效果Canvas繪圖與動畫基礎(chǔ)
如題?這節(jié)課的原理到底是啥?按道理,直接設(shè)置定時器那不就會動了嗎?
2016-07-13
源自:炫麗的倒計時效果Canvas繪圖與動畫基礎(chǔ) 4-1
正在回答
老師前面就說過,setInterval()中的兩個函數(shù),是一個設(shè)置動畫的基本框架。多年的開發(fā)經(jīng)驗。。。。。。。
尼瑪。。。原來還有一句,canvas clearRect() 方法。。。。可我還是不懂老師為什么要那樣寫
尼瑪。。。原來還有一句,
canvas clearRect() 方法
。。。。可我還是不懂老師為什么要那樣寫
<!DOCTYPE?html> <html> <head> <meta?charset="UTF-8"> <title></title> </head> <script?type="text/javascript"?src="digit.js"></script> <script?type="text/javascript"?src="my_1.js"></script> <body> <canvas?id="canvas"?style="border:?1px?solid?gray;margin:?50px?auto;display:?block;"> 當(dāng)前瀏覽器不支持Canvas,請更換瀏覽器再試 </canvas> </body> </html>
var?r=6; var?wd=120; var?showtime; const?endTime=new?Date(2016,6,14,18,47,52); window.onload=function(){ var?canvas=document.getElementById("canvas"); var?context=canvas.getContext("2d"); canvas.height=768; canvas.width=1366; setInterval(function(){ MyTime(context) } ,50); } function?MyTime(ct){ var?nowtime=new?Date(); var?showtime=endTime.getTime()-nowtime.getTime(); if(showtime<=0){ showtime=0; } showtime=Math.round(showtime/1000); var?hours=parseInt(showtime/3600), minutes=parseInt((showtime/60)%60), seconds=parseInt(showtime%60); console.log('一'+hours); console.log('二'+minutes); console.log('三'+seconds); mycanvas(0,0,ct,parseInt(hours/10)); mycanvas(wd,0,ct,parseInt(hours%10)); mycanvas(wd*2,0,ct,10); mycanvas(wd*3,0,ct,parseInt(minutes/10)); mycanvas(wd*4,0,ct,parseInt(minutes%10)); mycanvas(wd*5,0,ct,10); mycanvas(wd*6,0,ct,parseInt(seconds/10)); mycanvas(wd*7,0,ct,parseInt(seconds%10)); } function?mycanvas(X,Y,ct,num){ ct.fillStyle='red'; for(var?y=0;y<digit[num].length;y++) for(var?x=0;x<digit[num][y].length;x++){ if(digit[num][y][x]==1){ ct.beginPath(); ct.arc(X+x*(r+2)*2+(r+2),Y+y*(r+2)*2+(r+2),r,0,2*Math.PI); ct.closePath(); ct.fill(); } } }
不對。。。其實也可以。。。我自己寫錯了,可新的問題就是,隨著時間變化,畫布被填滿了。。。
var?WINDOW_WIDTH?=?1024; var?WINDOW_HEIGHT?=?768; var?RADIUS?=?8; var?MARGIN_TOP?=?60; var?MARGIN_LEFT?=?30; const?endTime?=?new?Date(2014,6,11,18,47,52); var?curShowTimeSeconds?=?0 window.onload?=?function(){ ????var?canvas?=?document.getElementById('canvas'); ????var?context?=?canvas.getContext("2d"); ????canvas.width?=?WINDOW_WIDTH; ????canvas.height?=?WINDOW_HEIGHT; ????curShowTimeSeconds?=?getCurrentShowTimeSeconds() ????setInterval( ????????function(){ ????????????render(?context?); ????????????update(); ????????} ????????, ????????50 ????); } function?getCurrentShowTimeSeconds()?{ ????var?curTime?=?new?Date(); ????var?ret?=?endTime.getTime()?-?curTime.getTime(); ????ret?=?Math.round(?ret/1000?) ????return?ret?>=?0???ret?:?0; } function?update(){ ????var?nextShowTimeSeconds?=?getCurrentShowTimeSeconds(); ????var?nextHours?=?parseInt(?nextShowTimeSeconds?/?3600); ????var?nextMinutes?=?parseInt(?(nextShowTimeSeconds?-?nextHours?*?3600)/60?) ????var?nextSeconds?=?nextShowTimeSeconds?%?60 ????var?curHours?=?parseInt(?curShowTimeSeconds?/?3600); ????var?curMinutes?=?parseInt(?(curShowTimeSeconds?-?curHours?*?3600)/60?) ????var?curSeconds?=?curShowTimeSeconds?%?60 ????if(?nextSeconds?!=?curSeconds?){ ????????curShowTimeSeconds?=?nextShowTimeSeconds; ????} } function?render(?cxt?){ ????cxt.clearRect(0,0,WINDOW_WIDTH,?WINDOW_HEIGHT); ????var?hours?=?parseInt(?curShowTimeSeconds?/?3600); ????var?minutes?=?parseInt(?(curShowTimeSeconds?-?hours?*?3600)/60?) ????var?seconds?=?curShowTimeSeconds?%?60 ????renderDigit(?MARGIN_LEFT?,?MARGIN_TOP?,?parseInt(hours/10)?,?cxt?) ????renderDigit(?MARGIN_LEFT?+?15*(RADIUS+1)?,?MARGIN_TOP?,?parseInt(hours%10)?,?cxt?) ????renderDigit(?MARGIN_LEFT?+?30*(RADIUS?+?1)?,?MARGIN_TOP?,?10?,?cxt?) ????renderDigit(?MARGIN_LEFT?+?39*(RADIUS+1)?,?MARGIN_TOP?,?parseInt(minutes/10)?,?cxt); ????renderDigit(?MARGIN_LEFT?+?54*(RADIUS+1)?,?MARGIN_TOP?,?parseInt(minutes%10)?,?cxt); ????renderDigit(?MARGIN_LEFT?+?69*(RADIUS+1)?,?MARGIN_TOP?,?10?,?cxt); ????renderDigit(?MARGIN_LEFT?+?78*(RADIUS+1)?,?MARGIN_TOP?,?parseInt(seconds/10)?,?cxt); ????renderDigit(?MARGIN_LEFT?+?93*(RADIUS+1)?,?MARGIN_TOP?,?parseInt(seconds%10)?,?cxt); } function?renderDigit(?x?,?y?,?num?,?cxt?){ ????cxt.fillStyle?=?"rgb(0,102,153)"; ????for(?var?i?=?0?;?i?<?digit[num].length?;?i?++?) ????????for(var?j?=?0?;?j?<?digit[num][i].length?;?j?++?) ????????????if(?digit[num][i][j]?==?1?){ ????????????????cxt.beginPath(); ????????????????cxt.arc(?x+j*2*(RADIUS+1)+(RADIUS+1)?,?y+i*2*(RADIUS+1)+(RADIUS+1)?,?RADIUS?,?0?,?2*Math.PI?) ????????????????cxt.closePath() ????????????????cxt.fill() ????????????} }
舉報
學(xué)習(xí)HTML5中最激動人心的技術(shù)Canvas,徹底釋放自己的創(chuàng)造力
2 回答為什么不直接把curShowTimeSeconds = getCurrentShowTimeSeconds();放到render函數(shù)中
1 回答為什么不直接使用curShowTimeSeconds = getCurShowTimeSeconds()
2 回答使用了setInterval()時間不會自動更新
7 回答setInterval為什么設(shè)置的是50ms
1 回答nextShowTimeSeconds和curShowTimeSeconds不是一樣的嗎?都是getCurrentShowTimeSeconds()的值,為什么還要比較?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2016-07-13
老師前面就說過,setInterval()中的兩個函數(shù),是一個設(shè)置動畫的基本框架。多年的開發(fā)經(jīng)驗。。。。。。。
2016-07-13
2016-07-13
2016-07-13
2016-07-13