摘要:即,把放大為倍時(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
摘要:渣渣成品圖最近對(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...
摘要:渣渣成品圖最近對(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...
摘要:渣渣成品圖最近對(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...
摘要:本文作者利用一些簡(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)在其中繪...
閱讀 2150·2021-11-05 09:42
閱讀 2894·2021-09-23 11:21
閱讀 2884·2019-08-30 14:00
閱讀 3344·2019-08-30 13:15
閱讀 494·2019-08-29 17:18
閱讀 3582·2019-08-29 16:29
閱讀 2796·2019-08-29 14:06
閱讀 2826·2019-08-23 14:41