前言
在 Canvas 中對文本填充水平或垂直的線性漸變可以輕易實現(xiàn),而帶角度的漸變就復(fù)雜很多;就好像下面這樣,假設(shè)文本矩形寬為 W
, 高為 H
, 左上角坐標(biāo)為 X, Y
。
猜想與答案
給出兩個答案:
正確答案是圖二,因為這樣得出來的坐標(biāo)生成的漸變最緊接文本矩形邊界,它的運動軌跡如下動圖:
(圖來源:Do you really know CSS linear-gradients)
漸變起點與終點坐標(biāo)的計算
所以,漸變的起點與終點坐標(biāo)該怎么計算呢?答:
線性漸變長度的計算 W3C 給出了一個公式(A 表示角度):
gradientLineLength = abs(W * sin(A)) + abs(H * cos(A))
不過,該公式主要應(yīng)用于 CSS 的線性漸變設(shè)置,即以 12 點鐘方向為 0°,順時針旋轉(zhuǎn)。
而我們需要的是以 3 點鐘方向為 0°,逆時針旋轉(zhuǎn),即公式為:
gradientLineLength = abs(W * cos(A)) + abs(H * sin(A)) // 半長: halfGradientLineLength = (abs(W * cos(A)) + abs(H * sin(A))) / 2
那么這個公式是怎么來的呢?以下是筆者的求解:
由圖可得以下方程組:
因此可推導(dǎo)出:
化簡后為:
所以 c1 + c2
為:
由三角函數(shù)平方公式知:cos(A) * cos(A) = 1 - sin(A) * sin(A)
, 代入 c1 + c2
:
第一步化簡后:
最后的結(jié)果就是:
因為 sin, cos
在函數(shù)周期內(nèi)存在負值(見下面角度對應(yīng)的三角函數(shù)周期圖),所以線性漸變的長度需要取絕對值。
至此,我們知道了線性漸變長度,文本矩形的中心點坐標(biāo)很好算,即:
centerX = X + W / 2 centerY = Y + H / 2
所以,起點與終點的坐標(biāo)分別為:
startX = centerX - cos(A) * halfGradientLineLength startY = centerY + sin(A) * halfGradientLineLength endX = centerX + cos(A) * halfGradientLineLength endY = centerY - sin(A) * halfGradientLineLength
看看最終效果
經(jīng)驗注釋
進行三角函數(shù)計算時,應(yīng)盡量避免先用 tan
, 因為 tan
在其周期內(nèi)存在無窮值,需要做特定的條件判斷,而 sin, cos
沒有此類問題,代碼書寫更為簡潔清晰并且不會因疏忽產(chǎn)生錯誤,見下面三角函數(shù)與角度的對應(yīng)關(guān)系周期圖。
參閱
Do you really know CSS linear-gradients?
MDN linear-gradient
W3C - CSS Images Module Level 3 # linear-gradients
到此這篇關(guān)于Canvas 文本填充線性漸變的使用詳解的文章就介紹到這了,更多相關(guān)Canvas文本填充線性漸變內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
標(biāo)簽:永州 池州 青島 西藏 棗莊 遼源 新疆 漯河
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Canvas 文本填充線性漸變的使用詳解》,本文關(guān)鍵詞 Canvas,文本,填充,線性,漸,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。