成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

使用canvas繪制圓弧動(dòng)畫(huà)

Kyxy / 2825人閱讀

摘要:即,把放大為倍時(shí),顯示效果會(huì)被拉伸當(dāng)不設(shè)置樣式寬高時(shí),瀏覽器中大小由畫(huà)布大小決定在實(shí)際開(kāi)發(fā)中,碰到一個(gè)例外,是在使用時(shí),繪制的標(biāo)簽如果只設(shè)置畫(huà)布大小時(shí),在移動(dòng)端的瀏覽器上顯示異常,正常?;氐綀A弧動(dòng)畫(huà),當(dāng)前動(dòng)畫(huà)有兩段,以順時(shí)針?lè)较蜻@段為例。

效果預(yù)覽

canvas 繪制基本流程

初始畫(huà)布

對(duì)于canvas的繪制,首先需要在html內(nèi)指定一塊畫(huà)布,即, 可以看做是在PS中新建一個(gè)空白文檔,之后所有的操作都將呈現(xiàn)在這個(gè)文檔之上,與PS的區(qū)別是,canvas本身沒(méi)有圖層的特性,當(dāng)需要展示不同維度的視圖時(shí),需要交由html的位置關(guān)系來(lái)解決。

canvas標(biāo)簽上,值得一提的就是width和height兩個(gè)屬性,這兩個(gè)屬性代表著畫(huà)布的寬高,與canvas樣式上的寬高有很大區(qū)別。在瀏覽器當(dāng)中,看到的圖形繪制大小,本身是由canvas.style.width/canvas.style.height決定的,他們決定了canvas這個(gè)dom元素的大小關(guān)系,而canvas.width和canvas.height決定的是canvas內(nèi)部圖形的大小關(guān)系。當(dāng)這兩個(gè)寬高比不同時(shí),就會(huì)產(chǎn)生視覺(jué)上的形變。即,把canvas.style.height放大為2倍時(shí),顯示效果會(huì)被拉伸:

當(dāng)不設(shè)置樣式寬高時(shí),瀏覽器中canvas大小由畫(huà)布大小決定(在實(shí)際開(kāi)發(fā)中,碰到一個(gè)例外,是在使用mapbox時(shí),繪制map的標(biāo)簽如果只設(shè)置canvas畫(huà)布大小時(shí),在ios移動(dòng)端的瀏覽器上顯示異常,PC正常)。

獲取上下文

所謂上下文,代表的就是一個(gè)環(huán)境,在這個(gè)環(huán)境當(dāng)中你可以獲取到相關(guān)的方法,變量。程序中有上下文,html的媒體中也有上下文,比如音頻上下文(AudioContext),只有拿到了上下文,才能進(jìn)行相關(guān)的方法操作,canvas也是如此,canvas上的方法都是借由canvas上下文得到。


const canvasL = document.getElementById("leftCanvas");
const cxtL = canvasL.getContext("2d");
配置線條

本次圓弧動(dòng)畫(huà)需要用到的上下文屬性有:

lineCap 線段端點(diǎn)形狀,本次設(shè)置為round

lineWidth 線寬

strokeStyle 線條填充顏色

clearRect 清除畫(huà)布里面的內(nèi)容

beginPath 在畫(huà)布上開(kāi)始一段新的路徑

arc 圓弧繪制參數(shù)配置

stroke 繪制

角度計(jì)算

角度計(jì)算之前,先介紹一下繪制圓弧的基礎(chǔ)api arc。

ctx.arc(x, y, radius, startAngle, endAngle [, anticlockwise]);

這個(gè)函數(shù)可以接收6個(gè)參數(shù),前五個(gè)為必填,分別為圓心x坐標(biāo),圓心y坐標(biāo),半徑,起始角度,結(jié)束角度,方向(默認(rèn)為false,順時(shí)針)。

回到圓弧動(dòng)畫(huà),當(dāng)前動(dòng)畫(huà)有兩段,以順時(shí)針?lè)较蜻@段為例。

x, y:在canvas當(dāng)中,坐標(biāo)系默認(rèn)以左上角為原點(diǎn),如果想讓圓弧動(dòng)畫(huà)以畫(huà)布中心點(diǎn)旋轉(zhuǎn),可以將圓心點(diǎn)設(shè)置為畫(huà)布中心點(diǎn),即畫(huà)布長(zhǎng)寬的1/2,假設(shè)設(shè)置的畫(huà)布長(zhǎng)寬均為100,那么圓心點(diǎn)的坐標(biāo)即為(50, 50),這個(gè)圓就繪制在了畫(huà)布中間。

radius:為了不與畫(huà)布產(chǎn)生切角,半徑設(shè)置比畫(huà)布一般略小,。

startAngle:起始角度為正北方向,而圓以x軸水平方向?yàn)?度,因此將起始點(diǎn)逆時(shí)針旋轉(zhuǎn)90°,即:-1 / 2 * Math.PI。

endAngle:因?yàn)閳A弧長(zhǎng)度為30°,終點(diǎn)角度在起始角度的基礎(chǔ)上增加 1 / 6 * Math.PI。

順時(shí)針?lè)较驁A弧初始配置為:

 cxtL.arc(WidthL / 2, HeightL / 2, WidthL / 2 - 5, -1 / 2 * Math.PI, 1 / 6 * Math.PI, false);
開(kāi)啟動(dòng)畫(huà)

window.requestAnimationFrame()

借助requestAnimationFrame,來(lái)對(duì)canvas圓弧進(jìn)行不斷的重繪,每次重繪canvas之前清空畫(huà)布,每輪動(dòng)畫(huà)方向角偏移2°,即2 / 180 * Math.PI,動(dòng)畫(huà)結(jié)束的標(biāo)記為圓弧終點(diǎn)的角度,移動(dòng)至3 / 2 * Math.PI,當(dāng)滿(mǎn)足條件時(shí),調(diào)用window.cancelAnimationFrame(animationId)取消動(dòng)畫(huà)。

屏幕適配

通過(guò)進(jìn)入html后,動(dòng)態(tài)獲取視口,來(lái)設(shè)置canvas寬高,比如希望畫(huà)布大小為窗口的寬度的15%,可以通過(guò)

const clientWidth = document.documentElement.clientWidth;
const canvasWidth = Math.floor(clientWidth * 0.15);
const canvasL = document.getElementById("leftCanvas");
canvasL.setAttribute("width", canvasWidth + "px");

這樣就可以使畫(huà)布適應(yīng)不同屏幕大小。

以下為未整理代碼,較亂,僅供參考。

https://codepen.io/jbleach/pe...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100976.html

相關(guān)文章

  • circle_clock 簡(jiǎn)單canvas實(shí)現(xiàn)圓弧時(shí)鐘

    摘要:渣渣成品圖最近對(duì)于圓形有種特別的感情呢因?yàn)閷?xiě)了個(gè)就像到了用來(lái)做時(shí)鐘大概會(huì)比較有趣吧所以就著手寫(xiě)了個(gè)這樣的一個(gè)東西大概代碼上錯(cuò)漏還是蠻多的接下來(lái)分享下關(guān)于如何開(kāi)發(fā)一個(gè)圓形時(shí)鐘條吧使用這次就沒(méi)有采用的方法來(lái)實(shí)現(xiàn)圓環(huán)了因?yàn)槲蚁胍龆鄬忧短椎膱A環(huán)覺(jué) 渣渣成品圖:http://codepen.io/thewindswor... 最近對(duì)于圓形有種特別的感情呢...因?yàn)閷?xiě)了個(gè)cricle_proce...

    boredream 評(píng)論0 收藏0
  • circle_clock 簡(jiǎn)單canvas實(shí)現(xiàn)圓弧時(shí)鐘

    摘要:渣渣成品圖最近對(duì)于圓形有種特別的感情呢因?yàn)閷?xiě)了個(gè)就像到了用來(lái)做時(shí)鐘大概會(huì)比較有趣吧所以就著手寫(xiě)了個(gè)這樣的一個(gè)東西大概代碼上錯(cuò)漏還是蠻多的接下來(lái)分享下關(guān)于如何開(kāi)發(fā)一個(gè)圓形時(shí)鐘條吧使用這次就沒(méi)有采用的方法來(lái)實(shí)現(xiàn)圓環(huán)了因?yàn)槲蚁胍龆鄬忧短椎膱A環(huán)覺(jué) 渣渣成品圖:http://codepen.io/thewindswor... 最近對(duì)于圓形有種特別的感情呢...因?yàn)閷?xiě)了個(gè)cricle_proce...

    寵來(lái)也 評(píng)論0 收藏0
  • circle_clock 簡(jiǎn)單canvas實(shí)現(xiàn)圓弧時(shí)鐘

    摘要:渣渣成品圖最近對(duì)于圓形有種特別的感情呢因?yàn)閷?xiě)了個(gè)就像到了用來(lái)做時(shí)鐘大概會(huì)比較有趣吧所以就著手寫(xiě)了個(gè)這樣的一個(gè)東西大概代碼上錯(cuò)漏還是蠻多的接下來(lái)分享下關(guān)于如何開(kāi)發(fā)一個(gè)圓形時(shí)鐘條吧使用這次就沒(méi)有采用的方法來(lái)實(shí)現(xiàn)圓環(huán)了因?yàn)槲蚁胍龆鄬忧短椎膱A環(huán)覺(jué) 渣渣成品圖:http://codepen.io/thewindswor... 最近對(duì)于圓形有種特別的感情呢...因?yàn)閷?xiě)了個(gè)cricle_proce...

    paney129 評(píng)論0 收藏0
  • 學(xué)習(xí)HTML5 Canvas這一篇文章就夠了

    摘要:本文作者利用一些簡(jiǎn)單的對(duì)進(jìn)行了系統(tǒng)的總結(jié),受益匪淺,毫不夸張的說(shuō),學(xué)習(xí)這一篇文章就夠了一簡(jiǎn)介是新增的,一個(gè)可以使用腳本通常為在其中繪制圖像的元素。 本文作者利用一些簡(jiǎn)單的 demo 對(duì) Canvas 進(jìn)行了系統(tǒng)的總結(jié),受益匪淺,毫不夸張的說(shuō),學(xué)習(xí) Canvas 這一篇文章就夠了! 一、canvas簡(jiǎn)介 ? 是 HTML5 新增的,一個(gè)可以使用腳本(通常為JavaScript)在其中繪...

    Eidesen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<