欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

canvas怎么實(shí)現(xiàn)環(huán)形進(jìn)度條效果

這篇文章將為大家詳細(xì)講解有關(guān)canvas怎么實(shí)現(xiàn)環(huán)形進(jìn)度條效果,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

渦陽(yáng)網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司

canvas怎么實(shí)現(xiàn)環(huán)形進(jìn)度條效果

這里就選canvas來(lái)簡(jiǎn)單寫(xiě)一下 先上代碼,然后在說(shuō)一說(shuō)需要注意的點(diǎn):

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>canvas環(huán)形進(jìn)度條</title>
 <style>
 body{
 background-color:#000;
 text-align: center;
 }
 .canvas1{
 margin-top: 100px;
 display: inline-block;
 background-color: #FFF;
 }
 </style>
</head>
<body>
 <canvas id="circle_process" class="canvas1"></canvas>
 <script>
 /*
 需求:環(huán)形、一周分為10個(gè)片段,根據(jù)進(jìn)度去走的一個(gè)狀態(tài)
 技術(shù)選型:canvas (挑戰(zhàn)加熟悉)
 思路:
 01 首先中間的文字部分不用說(shuō),使用canvas的畫(huà)文字。
 02 圓形是個(gè)規(guī)則圖形,那么為了避免畫(huà)不規(guī)則圖形,我們可以用圓和矩形來(lái)重疊出效果。
 a. 大的灰色背景圓
 b. 小一圈的白色背景圓
 c. 以同心圓的圓心為圓心,小圓為半徑為半徑復(fù)制畫(huà)10個(gè)小的矩形
 */
 //初始化動(dòng)畫(huà)變量
 var requestAnimationFrame = window.requestAnimationFrame || window.msRequestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame;
 var cancelAnimationFrame = window.cancelAnimationFrame || window.msCancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelRequestAnimationFrame;
 //初始化當(dāng)前進(jìn)度數(shù)
 var curPercentCount = 0;
 //獲取canvas對(duì)象,設(shè)置畫(huà)布大小
 var oC = document.querySelector('#circle_process');
 oC.width = 300;
 oC.height = 300;
 //獲取canvas執(zhí)行上下文
 var ctx = oC.getContext('2d');
 //定義小矩形的個(gè)數(shù)
 var miniRectCount = 10;
 //定義圓心位置
 var cirCenter = {
 x:oC.width/2,
 y:oC.height/2
 };
 //定義小矩形的大小rectSize
 var rectSize = {
 width:0,
 height:0
 };
 //圓對(duì)象構(gòu)造函數(shù)
 function Circle(center,radius){
 this.center = center;
 this.radius = radius;
 }
 //小矩形對(duì)象構(gòu)造函數(shù)
 function MiniRect(length,width){
 this.length = length;
 this.width = width;
 }
 //角度轉(zhuǎn)換成弧度的函數(shù)
 function d2a(angleInt){
 return angleInt*Math.PI / 180;
 }
 //百分比轉(zhuǎn)換角度函數(shù)(這里減90因?yàn)閍rc0度是從右側(cè)開(kāi)始的)
 function percentTurn(percentFloat){
 return percentFloat * 360 / 100 - 90;
 }
 //畫(huà)當(dāng)前百分比扇形的方法
 function drawFanForPercent(percentFloat){
 ctx.beginPath();
 ctx.moveTo(cirCenter.x,cirCenter.y);
 ctx.lineTo(oC.width/2,(oC.height-baseCircle.radius*2)/2);
 ctx.arc(cirCenter.x,cirCenter.y,baseCircle.radius,d2a(-90),d2a(percentTurn(percentFloat)));
 ctx.fillStyle = 'aqua';
 ctx.fill();
 ctx.closePath();
 }
 //畫(huà)圓的函數(shù)
 function drawArc(center,radius,start,end,type,color){
 start = start || 0;
 end = end || 360;
 ctx.beginPath();
 ctx.arc(center.x,center.y,radius,d2a(start),d2a(end));
 ctx.fillStyle = color;
 ctx.strokeStyle = color;
 if(!!type){
 (type === 'fill') && ctx.fill();
 (type === 'stroke') && ctx.stroke();
 }
 ctx.closePath();
 }
 //畫(huà)文字的函數(shù)
 function drawPercentText(text,percentInt){
 ctx.beginPath();
 ctx.fillStyle = 'aqua';
 ctx.font="italic small-caps bold 40px Calibri";
 ctx.textAlign = 'center';
 ctx.fillText(text,cirCenter.x,cirCenter.y-18,100);
 ctx.closePath();
 ctx.beginPath();
 ctx.fillStyle = 'aqua';
 ctx.font="italic small-caps bold 60px Calibri";
 ctx.textAlign = 'center';
 ctx.fillText(percentInt+'%',cirCenter.x,cirCenter.y+40,100);
 ctx.closePath();
 }
 //畫(huà)小方塊的方法
 function drawMiniRect(startPoint,width,height,axisPoint,rotateAngle){
 /*
 ctx.beginPath();
 //平移,畫(huà)出第一個(gè)
 ctx.save();
 ctx.translate(startPoint.x,startPoint.y);
 ctx.fillStyle = '#FFF';
 ctx.fillRect(0,0,rectSize.width,rectSize.height);
 ctx.restore();
 ctx.closePath();
 //這種先平移畫(huà)出在旋轉(zhuǎn)的思路是錯(cuò)的,畫(huà)之后就不能轉(zhuǎn)了
 ctx.save();
 ctx.translate(axisPoint.x,axisPoint.y);
 ctx.rotate(rotateAngle);
 ctx.restore();
 */
 ctx.save();
 ctx.translate(axisPoint.x,axisPoint.y); /*畫(huà)布平移到圓的中心*/
 ctx.rotate(d2a(rotateAngle)); /*旋轉(zhuǎn)*/
 /*畫(huà)*/
 ctx.beginPath();
 ctx.fillStyle = '#FFF';
 ctx.fillRect(startPoint.x,startPoint.y,rectSize.width,rectSize.height);
 ctx.closePath();
 ctx.restore();
 }
 //畫(huà)整體
 function draw(curPercent){
 //底部灰色圓
 drawArc(baseCircle.center,baseCircle.radius,null,null,'fill','#CCC');
 //進(jìn)度扇形
 drawFanForPercent(curPercent);
 //內(nèi)部白色遮擋圓
 drawArc(innerCircle.center,innerCircle.radius,null,null,'fill','#FFF');
 //畫(huà)文字
 drawPercentText('當(dāng)前進(jìn)度',curPercent);
 //十個(gè)小的矩形
 for(var i=0; i<miniRectCount; i++){
 drawMiniRect(startPoint,rectSize.width,rectSize.height,cirCenter,i*360/miniRectCount);
 }
 }
 //實(shí)例化底圓和內(nèi)圓
 var baseCircle = new Circle(cirCenter,130);
 var innerCircle = new Circle(cirCenter,100);
 //設(shè)置rectSize數(shù)值
 rectSize.width = 15;
 rectSize.height = baseCircle.radius - innerCircle.radius + 5;
 //設(shè)置第一個(gè)小矩形的起始點(diǎn) (這里有誤差)
 // var startPoint = {
 // x: oC.width /2 - 7.5,
 // y: (oC.height - baseCircle.radius*2) / 2
 // };
 //由于平移到中心點(diǎn)之后畫(huà)的位置是在畫(huà)布外的,所以重新定義
 var startPoint = {
 x:-7.5,
 y:-baseCircle.radius - 2
 };
 //這里開(kāi)定時(shí)去顯示當(dāng)前是百分之幾的進(jìn)度
 var raf = null;
 var percent = 0;
 function actProcess(percentFloat){
 percentFloat = percentFloat || 100;
 percent = Math.round(percentFloat);
 console.log(percent);
 curPercentCount++;
 raf = requestAnimationFrame(function(){
 actProcess(percentFloat);
 });
 draw(curPercentCount);
 if(curPercentCount >= percent){
 cancelAnimationFrame(raf);
 return;
 }
 }
 actProcess(50);
 // cancelAnimationFrame(raf);
 //這里沒(méi)搞懂為什么percent會(huì)加 ?
 //解: requestAnimationFrame中方法還是需要有參數(shù),這里就用匿名函數(shù)回調(diào)的執(zhí)行體去指定。
 /*
 //setInterval的方式
 function actProcess(percentFloat){
 if(curPercentCount >= percentFloat){
 clearInterval(timer);
 return;
 }
 curPercentCount++;
 draw(curPercentCount);
 }
 clearInterval(timer);
 var timer = setInterval(function(){
 actProcess(50);
 },16.7);
 */
  //直接畫(huà)弧形的測(cè)試:
 //drawArc(innerCircle.center,innerCircle.radius,0,260,'fill','red');
 /*
 用到的技術(shù)點(diǎn):
 01 canvas平移
 02 canvas畫(huà)布狀態(tài)保存于恢復(fù)
 03 canvas旋轉(zhuǎn)
 04 canvas clearRect配合動(dòng)畫(huà)requestAnimationFrame
 05 canvas寫(xiě)文字
 */
 </script>
</body>
</html>

接下來(lái)說(shuō)一些注意點(diǎn)和我寫(xiě)的過(guò)程中碰到的疑問(wèn):

疑問(wèn):

01 整體代碼沒(méi)有封裝成一個(gè)組件,感興趣的同學(xué)可以封裝一下。 我這有時(shí)間也會(huì)封裝。

02 畫(huà)文字的時(shí)候只能單獨(dú)畫(huà)一行文字么? 怎樣進(jìn)行換行?

03 canvas怎樣處理響應(yīng)式?

注意點(diǎn):

01 畫(huà)布平移之后,畫(huà)布上的點(diǎn)也會(huì)被平移,所以我在定義第一個(gè)小矩形的起始點(diǎn)的時(shí)候才會(huì)重新定義一個(gè)負(fù)值。

02 直接畫(huà)弧形來(lái)控制進(jìn)度不準(zhǔn)確,因?yàn)閍rc會(huì)自動(dòng)closePath(),最終形成這樣的一個(gè)效果。

canvas怎么實(shí)現(xiàn)環(huán)形進(jìn)度條效果

03 默認(rèn)圓的0度起始位置是從3點(diǎn)鐘方向開(kāi)始的(見(jiàn)上圖),那么想從12點(diǎn)鐘位置開(kāi)始走進(jìn)度,需要減去90度的角度。

04 requestAnimationFrame的回調(diào)函數(shù)在有參數(shù)的情況下還是需要傳參數(shù)的,需要借助匿名函數(shù)回調(diào),在執(zhí)行體里面去執(zhí)行想要loop的函數(shù)內(nèi)容(可傳參數(shù))。否者會(huì)出現(xiàn)注釋中寫(xiě)道的pecent不規(guī)則增加的問(wèn)題。

先就這樣,之后可能會(huì)結(jié)合一個(gè)上傳圖片的小功能?chē)L試把它封裝成一個(gè)組件。

關(guān)于“canvas怎么實(shí)現(xiàn)環(huán)形進(jìn)度條效果”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

新聞標(biāo)題:canvas怎么實(shí)現(xiàn)環(huán)形進(jìn)度條效果
URL標(biāo)題:http://chinadenli.net/article38/gpdhsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、定制開(kāi)發(fā)、虛擬主機(jī)、企業(yè)網(wǎng)站制作網(wǎng)站設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管

網(wǎng)站設(shè)計(jì)公司知識(shí)

日韩性生活视频免费在线观看| 老熟妇乱视频一区二区| 中文字幕中文字幕一区二区| 隔壁的日本人妻中文字幕版| 国产成人精品午夜福利| 亚洲视频偷拍福利来袭| av一区二区三区天堂| 国产一区欧美一区二区| 丝袜破了有美女肉体免费观看 | 日本欧美三级中文字幕| 在线视频免费看你懂的| 欧美午夜不卡在线观看| 绝望的校花花间淫事2| 亚洲国产丝袜一区二区三区四| 国内午夜精品视频在线观看| 精品香蕉国产一区二区三区| 日本99精品在线观看| 国产麻豆成人精品区在线观看| 免费在线成人午夜视频| 国产一区二区三区精品免费| 麻豆蜜桃星空传媒在线观看| 少妇成人精品一区二区| 五月婷婷六月丁香亚洲| 日韩无套内射免费精品| 亚洲日本韩国一区二区三区| 国产一级特黄在线观看| 日韩人妻少妇一区二区| 在线观看视频成人午夜| 中文字幕五月婷婷免费| 亚洲精品一区三区三区| 久久re6热在线视频| 日韩一区二区三区高清在| 亚洲国产香蕉视频在线观看| 激情三级在线观看视频| 久久91精品国产亚洲| 国产成人精品综合久久久看| 国产欧美日韩在线精品一二区 | 久一视频这里只有精品| 殴美女美女大码性淫生活在线播放| 国产一区欧美一区日韩一区| 色综合伊人天天综合网中文|