Core Animation實戰(zhàn)之環(huán)形顏色漸變進(jìn)度條

小弟才疏學(xué)淺腋颠,第一次寫簡書文章繁成,內(nèi)容難免有錯誤或者不妥吓笙,歡迎大家來指點江山淑玫。。面睛。


先來看一下最終的效果:


特點:圓環(huán)是順時針旋轉(zhuǎn)絮蒿,旋轉(zhuǎn)的過程中,始終保持圓環(huán)的開始端顏色最淺(白色)叁鉴,圓環(huán)的結(jié)尾是最深(0xEC1161).

在剛開始要做這個東西的時候土涝,是因為想做一個下拉刷新的動畫,這個動畫要做到在下拉的過程中幌墓,有一個顏色漸變的圓環(huán)在變大但壮,而且是要始終保濕圓環(huán)的開頭是白色,圓環(huán)的結(jié)尾是0xEC1161最深色常侣。

想了幾個方法蜡饵,都不太理想,其中包括在圓環(huán)的底部放置一個圓環(huán)圖片胳施,下拉過程中溯祸,拖過CALayer的mask功能來把需要顯示的圓環(huán)給扣出來顯示,最終我采用了最簡單的方式,就是直接無限旋轉(zhuǎn)一個圓環(huán)圖片焦辅,醉了博杖。。

這事完了之后筷登,我不甘心剃根,決定好好來實現(xiàn)以下這個動畫效果,就來了這個前方;下面簡要分析寫這個動畫的實現(xiàn)邏輯(可能對后續(xù)要實現(xiàn)一個進(jìn)度條或者類似于360安全衛(wèi)士清理時的進(jìn)度條有一定的幫助)跟继。

1. 這個圓環(huán)底部是一個UIView,在UIView上添加N(N>=2)個扇形的漸變CAGradientLayer镣丑,并讓這幾個扇形漸變的層正好布滿這個圓舔糖;

2. 這一系列扇形的CAGradientLayer的制作方法是:

a) 先畫一個UIView上半部分大小的CAGradientLayer;

b) 計算CAGradientLayer的startPoint和endPoint莺匠,這倆值的大小是根據(jù)1中的N決定的金吗,N越大,endPoint.x-startPoint.x越小趣竣,而且endPoint.x和startPoint.x是以0.5為中心向兩邊偏移相等的距離摇庙,startPoint.x=0.5-sin(1.f/N*M_PI)/2.f,endPoint.x=0.5+sin(1.f/N*M_PI)/2.f遥缕,這里用到了簡單的直角三角形的sin函數(shù)計算卫袒;

c) 制作一個扇形的Layer,并把這個扇形Layer作為CAGradientLayer的mask单匣,扇形Layer的UIBezierPath的繪制也是以中間為軸夕凝,向兩邊偏移,偏移的大小b中的計算是一樣的户秤,startAngle=(-90.f/180.f*M_PI - 1.f/N*M_PI)码秉, endAngle=(-90.f/180.f*M_PI + 1.f/N*M_PI)

d) 最后,按照添加的次序鸡号,依次旋轉(zhuǎn)CAGradientLayer转砖,使得N個Layer正好鋪成一個圓;

3. 然后在最上層添加一個CAShapeLayer鲸伴,并且讓這個layer的frame的大小比最底層的UIView的frame稍微小一點(這個差值就是圓環(huán)的粗細(xì))府蔗,同時讓這個Layer的position等于UIView的center;

4. 稍微旋轉(zhuǎn)下最上層的CAShapeLayer汞窗,以做到等下針對該Layer的strokeStart做動畫時姓赤,能夠從中標(biāo)的0點鐘位置開始,順時針方向做動畫;

5. 下面是動畫的部分杉辙,動畫分為兩個步驟模捂,一個是針對oval.strokeStart的動畫捶朵,一個是針對N各扇形layer的locations的動畫

a) 針對oval.strokeStart的動畫簡單,執(zhí)行N個單位時間狂男,直接添加該動畫即可综看;

b) 針對N各扇形的動畫,是依次延遲 i (i從0開始)執(zhí)行的岖食,執(zhí)行N-i個單位時間红碑,并且每一個扇形的locations的開始值得第一個值是-i,第二個值是0泡垃,而且結(jié)束值得第一個值不變析珊,第二個值是N-1,這是為什么呢?是因為要做到N個扇形的顏色能夠無縫銜接蔑穴,具體原因上代碼(Talk is cheap, show me the code.)忠寻,大家一看便明了(注:在初始化扇形Layer的時候,已經(jīng)指定過了layer.locations=@[@(-i),@0.f]);

至此存和,大功告成奕剃,GradientLayerCount的值就是N,可以隨意修改配置捐腿,但是要保證大于等于2.

最后附上項目完整代碼鏈接(https://github.com/ShakeShakeMe/CircleProcessBar)纵朋。


修改:修改為可以手動執(zhí)行動畫(也就是通過滑塊來執(zhí)行動畫)。



(歡迎大家來踩)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茄袖,一起剝皮案震驚了整個濱河市操软,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宪祥,老刑警劉巖聂薪,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異品山,居然都是意外死亡胆建,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門肘交,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扑馁,你說我怎么就攤上這事涯呻。” “怎么了腻要?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵复罐,是天一觀的道長。 經(jīng)常有香客問我雄家,道長效诅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮乱投,結(jié)果婚禮上咽笼,老公的妹妹穿的比我還像新娘。我一直安慰自己戚炫,他們只是感情好剑刑,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著双肤,像睡著了一般施掏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茅糜,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天七芭,我揣著相機與錄音,去河邊找鬼蔑赘。 笑死抖苦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的米死。 我是一名探鬼主播锌历,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峦筒!你這毒婦竟也來了究西?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤物喷,失蹤者是張志新(化名)和其女友劉穎卤材,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峦失,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡扇丛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尉辑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帆精。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖隧魄,靈堂內(nèi)的尸體忽然破棺而出卓练,到底是詐尸還是另有隱情,我是刑警寧澤购啄,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布襟企,位于F島的核電站,受9級特大地震影響狮含,放射性物質(zhì)發(fā)生泄漏奴曙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一侵状、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冰评,春花似錦、人聲如沸府蛇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汇跨。三九已至务荆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間穷遂,已是汗流浹背函匕。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚪黑,地道東北人盅惜。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像忌穿,于是被迫代替她去往敵國和親抒寂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容