最近看到了郭霖大神寫的博客,關(guān)于屬性動(dòng)畫的使用的。Android屬性動(dòng)畫完全解析(上),初識(shí)屬性動(dòng)畫的基本用法

覺得講的真的是很有意思,通俗易懂。一口氣看完上中下三篇,腰不疼氣不喘呀哈哈。。。
剛好公司的UI設(shè)計(jì)師來(lái)跟我說現(xiàn)在新的設(shè)計(jì)中會(huì)有一個(gè)評(píng)價(jià)好評(píng)率,到時(shí)旁邊要有一個(gè)圓環(huán)來(lái)代表進(jìn)度,最好還要有動(dòng)畫效果,就那種一開始就轉(zhuǎn)動(dòng),從0轉(zhuǎn)到當(dāng)前進(jìn)度的效果。UI大概長(zhǎng)這個(gè)樣子:

其實(shí)這個(gè)的效果就很像是京東小白信用的那個(gè)動(dòng)畫效果了。

剛好看完郭霖大神對(duì)于屬性動(dòng)畫的講解,感覺這個(gè)應(yīng)該難度不是很大。于是說干就干。
首先是要先分析一下View的構(gòu)成

也就是說其實(shí)這個(gè)View可以分為三層:
1、最底下一層,是一個(gè)不會(huì)變的圓
2、一個(gè)深色的,代表進(jìn)度的扇形
3、中間的的小圓
其中1和3是不會(huì)變的,所謂的進(jìn)度其實(shí)就是2中扇形的圓心角的度數(shù)了
所以我們要分層的把View畫出來(lái)
先創(chuàng)建一個(gè)自定義的View

在自定義的View中先定義好即將要用到的變量,同時(shí)重寫一下最重要的?onDraw();
然后是先定義好xml中即將要用到的自定義View的屬性
定義在項(xiàng)目的attrs.xml文件中

然后重寫自定義View構(gòu)造函數(shù)
把xml中的屬性讀取進(jìn)來(lái),同時(shí)初始化一下即將要用的畫筆

PS:使用完 TypeArray 之后記得調(diào)用一下 TypeArray.recycle()釋放資源
好了,準(zhǔn)備工作做的差不多了,我們來(lái)先畫第一個(gè)圓

在onDraw()中調(diào)用一下,看下效果

效果

第一個(gè)圓已經(jīng)成功的畫出來(lái)了
現(xiàn)在畫代表進(jìn)度的扇形

效果

為了能看到效果,先讓扇形的角度等于270,實(shí)際上扇形的角度是要給屬性動(dòng)畫控制的,根據(jù)動(dòng)畫的時(shí)長(zhǎng)來(lái)控制
再畫一個(gè)中間的小圓

調(diào)用一下

效果

吶,現(xiàn)在是不是已經(jīng)長(zhǎng)得有點(diǎn)像射雞獅要求的了啦,可能你會(huì)說顏色不對(duì)啊,可別忘記了我們?cè)缇皖A(yù)留了自定義屬性呢

修改成射雞獅制定的顏色及圓環(huán)的寬度之后,是不是基本就是這個(gè)圓了。

但目前為止,自定義View是畫完了,接下來(lái)就是添加動(dòng)畫了
動(dòng)畫是使用新的屬性動(dòng)畫,以前的補(bǔ)間動(dòng)畫和幀動(dòng)畫已經(jīng)不能滿足我們的需要了
如果對(duì)于屬性動(dòng)畫不了解的可以看看Android屬性動(dòng)畫完全解析(上),初識(shí)屬性動(dòng)畫的基本用法,然后順便把它接下去的中、下篇也看一下,就能理解了。
最后,實(shí)現(xiàn)動(dòng)畫效果

動(dòng)畫的實(shí)現(xiàn)很簡(jiǎn)單,只是對(duì)目標(biāo)角度進(jìn)行一個(gè)平滑的過渡,然后在過渡的過程中不斷的重畫扇形
調(diào)用動(dòng)畫

效果

動(dòng)畫是不是已經(jīng)很順暢的跑起來(lái)了
可以開始整理代碼了
首先我們肯定不滿足參數(shù)只能在xml指定,特別是代表進(jìn)度的扇形的角度,這個(gè)必須是拿到真實(shí)數(shù)據(jù)之后才能計(jì)算得到的。所以,有必要把一些接口給暴露出來(lái)
考慮到View的可定制性,我暴露以下這些

這樣就可以供我們?cè)诘玫綄?shí)際數(shù)據(jù)之后對(duì)View進(jìn)行定制了

最終,在我編寫的UI界面中使用
