iOS實現乙個顏色漸變的弧形進度條

2021-12-29 20:31:29 字數 4359 閱讀 6151

在github上看到一些進度條的功能,都是通過core graph來實現。無所謂正確與否,但是開發效率明顯就差很多了,而且執行效率還是值得考究的。其實使用蘋果提供的core animation能夠非常簡單和方便的實現環形進度條效果,而且還可以高效的保證動畫效果,無論是前進還是後退(語言水平比較有限,就多用**說話)。

80%的狀態:

99%的狀態:

#define degreestoradians(x) (m_pi*(x)/180.0) //把角度轉換成pi的方式

#define progreess_width 80 //圓直徑

#define progress_line_width 4 //弧線的寬度

首先,你得要引入core animation框架。為了實現環形效果,需要使用到cashapelayer,原理是cashapelayer可以通過指定path的方式實現生成乙個圖形,非常方便。

由於需要畫乙個圓形,uibeziperpath是非常好用的畫圓形的工具。實現下面的**可以畫出上面所示的整個軌道。這個圓形是從-210度的角度到30度。

uibezierpath *path = [uibezierpath bezierpathwitharccenter:cgpointmake(40, 40) radius:(progreess_width-progress_line_width)/2 startangle:degreestoradians(-210) endangle:degreestoradians(30) clockwise:yes];

這裡原理很簡單,就是使用cashapelayer和uibezierpath結合起來就能夠達成目標,這一步的結果如下所示:

_tracklayer = [cashapelayer layer];//建立乙個track shape layer

_tracklayer.frame = self.bounds;

[self.layer addsublayer:_tracklayer];

_tracklayer.fillcolor = [[uicolor clearcolor] cgcolor];

_tracklayer.strokecolor = [_strokecolor cgcolor];//指定path的渲染顏色

_tracklayer.opacity = 0.25; //背景同學你就甘心做背景吧,不要太明顯了,透明度小一點

_tracklayer.linecap = kcalinecapround;//指定線的邊緣是圓的

_tracklayer.linewidth = progress_line_width;//線的寬度

uibezierpath *path = [uibezierpath bezierpathwitharccenter:cgpointmake(40, 40) radius:(progreess_width-progress_line_width)/2 startangle:degreestoradians(-210) endangle:degreestoradians(30) clockwise:yes];//上面說明過了用來構建圓形

_tracklayer.path =[path cgpath]; //把path傳遞給layer,然後layer會處理相應的渲染,整個邏輯和coregraph是一致的。

首先要明確的需求是,我們需要顏色根據百分比從紅色漸變到黃色然後再到藍色。

怎麼實現這個顏色的漸變效果。這裡我們需要使用到cagradientlayer,cagradientlayer是乙個用來畫顏色漸變的層(如果使用透明的顏色,也就可以做到透明漸變)。我們先用cagradientlayer做出漸變效果,然後把shapelayer作為gradientlayer的mask來截取出需要的部分,以此達到漸變的進度條效果。

首先,需要構建出順著弧形的顏色漸變。上面的需求我們可以分解成兩部分。

①左半部分,顏色從紅色漸變到黃色。

②右半部分,顏色從黃色漸變到藍色。

由此可以了解到是我們需要兩個cashapelayer。

為什麼要這麼折騰?cashapelayer不能順著弧線進行漸變只能指定兩個點之間進行漸變。所以只能曲線救國了。

先看看這個部分的效果:

然後,建立乙個新的cashapelayer來擷取這個顏色漸變的層。

這部分**如下所示:

_progresslayer = [cashapelayer layer];

_progresslayer.frame = self.bounds;

_progresslayer.fillcolor = [[uicolor clearcolor] cgcolor];

_progresslayer.strokecolor = [process_color cgcolor];

_progresslayer.linecap = kcalinecapround;

_progresslayer.linewidth = progress_line_width;

_progresslayer.path = [path cgpath];

_progresslayer.strokeend = 0;

calayer *gradientlayer = [calayer layer];

cagradientlayer *gradientlayer1 = [cagradientlayer layer];

gradientlayer1.frame = cgrectmake(0, 0, self.width/2, self.height);

[gradientlayer1 setcolors:[nsarray arraywithobjects:(id)[[uicolor redcolor] cgcolor],(id)[uicolorfromrgb(0xfde802) cgcolor], nil]];

[gradientlayer1 setlocations:@[@0.5,@0.9,@1 ]];

[gradientlayer1 setstartpoint:cgpointmake(0.5, 1)];

[gradientlayer1 setendpoint:cgpointmake(0.5, 0)];

[gradientlayer addsublayer:gradientlayer1];

cagradientlayer *gradientlayer2 = [cagradientlayer layer];

[gradientlayer2 setlocations:@[@0.1,@0.5,@1]];

gradientlayer2.frame = cgrectmake(self.width/2, 0, self.width/2, self.height);

[gradientlayer2 setcolors:[nsarray arraywithobjects:(id)[uicolorfromrgb(0xfde802) cgcolor],(id)[main_blue cgcolor], nil]];

[gradientlayer2 setstartpoint:cgpointmake(0.5, 0)];

[gradientlayer2 setendpoint:cgpointmake(0.5, 1)];

[gradientlayer addsublayer:gradientlayer2];

[gradientlayer setmask:_progresslayer]; //用progresslayer來擷取漸變層

[self.layer addsublayer:gradientlayer];

走到上面一步我們得到的效果是乙個進度為100%的效果,_progresslayer的長度和_tracklayer的長度是一樣的。那麼怎麼解決百分比的問題呢?

cashapelayer有乙個strokeend的屬性,這個屬性是從0到1的浮點型別,正好可以用表達百分比,而且這個屬性是animatable,可以動態的表示進度的變化。

如下**所示:

-(void)setpercent:(nsinteger)percent animated:(bool)animated

①進度條的百分比是通過cashapelayer的strokeend屬性來實現。

②環形的漸變進度條,通過結合cashapelayer和cagradientlayer實現,注意layer的mask屬性的使用。

2、

ios弧形進度條 iOS快速實現環形漸變進度條

前言 一 先製作乙個不帶顏色漸變的進度條 自定義乙個cycleview,在.m 中實現drawrect方法 void drawrect cgrect rect cgcontextref ctx uigraphicsgetcurrentcontext 獲取上下文 cgpoint center cgpo...

ios弧形進度條 iOS快速實現環形漸變進度條

前言 一 先製作乙個不帶顏色漸變的進度條 自定義乙個cycleview,在.m 中實現drawrect方法 void drawrect cgrect rect cgcontextref ctx uigraphicsgetcurrentcontext 獲取上下文 cgpoint center cgpo...

canvas繪製乙個漸變顏色的矩形

lang en charset utf 8 titletitle canvas lineargradient style head class lineargradient div width 600 height 400 canvas var mycanvas document.querysele...