1. 程式人生 > >一個比較牛逼好用的圓形progress進度

一個比較牛逼好用的圓形progress進度

        因公司需要些一個載入的progress。然後美工妹子給出的圖片是這個樣子,開始我是拒絕的。但是男人怎麼能說不行。然後就默默的擼程式碼了。

一、需求說明:

         先說下這個圖片的需求:

        1.首先最外面一層是有很多小圓點的,當進度沒有跑過來的時候是灰的,當進度來的時候是白色的。

        2.方向是逆時針的。

        3.在最上面還有兩個缺口,進度走到這裡來的時候也是要將缺口流出來。

        4.在progress的最前面會有一個發亮的標記,標記當前進度的位置。

        5.中間顯示“%”或者“S”。

        效果圖:

        由於手機錄屏的做成gif圖的時候老是出問題。為了節約時間直接截了部分圖。但是實際上是動態的。大家應該能想象吧。


        做開發第一點肯定是要明確需求,不然你做的不是人家想要的不是白做了嗎?現在看來需求是捋明白了,現在就是想如何實現這個事情了。

二、如何實現。

        通過對需求的分析。我們可以將問題分解:

        注意:每一個分解步驟都是一個方法。

        1.我們先確定一些資料。例如測量出圓心的座標。等我們需要測量的單位,這裡可以不用急著做。做到需要測量的時候我們就再測量就可以了。我們可以放在measureData();方法裡面

       2.我們從最簡單的入手,畫最中間的字。這個就比較簡單了啦。這裡我就直接截圖了。原始碼可以加微信群然後我會在裡面分享給大家。


        這個裡面主要做的2件事情就是畫數字和後面的%或者S由於後面的字元要比前面的小這個裡面還有講後面文字縮小的,mTextSize/2就是。然後設定他們之間的距離。其實就是思路梳理清楚了很簡單,就是api的呼叫不要想的怎麼樣怎麼樣。確定步驟了就一步步的畫。       

 3.在內切圓上面畫最外面那一圈小圓,這個的肯定要先確定圓心,最外層小圓的半徑(這個可以讓呼叫這個類的人設定),還有就是最大圓的半徑。確定好了就可以畫了。上圖。


        這裡的畫if判斷是說如果最外層是20個點的話,如果進度是50%,那麼肯定前面10個要設定成不同的顏色。後面10個是灰色。這個是動態的。如果我們在外面開啟一個執行緒的話小圓點會一流跑。然後猶豫需求是逆時針的,所以是 360-360f/mcopy。

    4.畫內部的progress的背景。就是progress灰色的底部。我們呼叫的api是

canvas.drawArc(RectF,StartAngle,SweepAngle,false,Paint);第一個引數是畫的區域,第二個引數是開始的角度,第三個引數是掃過多少度,第四個引數如果味false是隻畫一段弧,如果味true的畫會在弧的兩端和圓心連結起來。第五個引數我不想講。如果有不知道的可以來我房裡我單獨告訴你。

        我們得用到這個方法。應為從圖上可以看出圓上面有兩個間隙不能直接是用drawCircle();好了說了這麼多還是上程式碼吧。


        大家可能有點疑惑offset偏移量仔細看圖發現沒有progress起點在最上面,而且和間隙不是分開的。大家也可以不設定這個偏移量,修改startAngle。我這裡stargAngle是-90,offset是5,然後就是gaps這個就是間隙的距離外部可以傳過來。

        5.好了最大的最難的問題來了如何畫這個白色的進度,而且還有一段一段的,而且還是動態可以跑動的。其實思路清晰了也沒有那麼複雜了。就是分段做不同的處理。還是上程式碼吧,程式碼裡面都有分段的處理。


程式碼裡面就是一段一段的情況如何出來。只要將這個理清楚了基本上就不是什麼問題了。只有最有一個畫progress上面的小圓點了。

         5.畫圓點。


基本上沒有什麼問題吧。

這些就寫完了所有的畫圖。然後需要自定義屬性的就可以自定義屬性。不自定義屬性的就直接new出來設定相應需要設定的值就可以了。

-----------------------------------------------------------------------------------------

一個自定義控制元件就是這麼寫完的。沒有大家想的那麼複雜,大家不要怕,其實什麼都是這樣的。api不都已經給好了嗎。我們寫什麼都是肯定能寫出來的。只是說我們的可擴充性的問題。這個的畫我自己也是暈乎乎的,這個就要靠多寫了。

然後說說

    1.假設需要100%的回掉是不是,就可以加一個介面也是很簡單的事不事。

    2.我們又假設要加點選時間處理是不是,有什麼複雜的嗎。我之前寫的自定義事件處理就這麼加啊。


        寫onTouchEvent然後手指不都會有座標可以調麼。你畫的圖不也都有位置麼。這樣一處理判斷就可以了。

        嗯好了還是那句話有什麼不懂的留言。然後大家可以關注公眾號加群。大家相互幫助相互交流。謝謝大家了。這個裡面我會分享原始碼的。還有更多的其他的自定義控制元件哦。圖表的。會一直給大家推送原創文章的希望大家轉載。再次謝謝大家了。