關(guān)于安卓自定義進(jìn)度條(二)

先上gif效果圖:

效果圖

上圖中,藍(lán)色的進(jìn)度條為自定義進(jìn)度條

注意!??!源碼在文末

背景

要實(shí)現(xiàn)一個(gè)進(jìn)度條,大部分情況下,都是需要進(jìn)行自定義的。因?yàn)樵退隳阕远x了背景圖片,但是一旦進(jìn)度條的高度,超過(guò)了一定的范圍,且進(jìn)度在1%左右的時(shí)候,就會(huì)看到明顯的“卡邊”情況。
就是進(jìn)度條如果是圓角的背景,但是如果是小進(jìn)度的時(shí)候,進(jìn)度會(huì)顯示出一個(gè)長(zhǎng)方形。因此為了一了百了,則有了這篇文章,自定義進(jìn)度條!




思路

要實(shí)現(xiàn)自定義進(jìn)度條,首先,是需要有canvas的基礎(chǔ)知識(shí)的。如果沒(méi)有,則需要自行學(xué)習(xí)。
伸手黨看到這里,可以關(guān)閉網(wǎng)頁(yè)了。

首先,如開(kāi)頭的圖片所示,進(jìn)度條,有以下要素:

(1)區(qū)分為當(dāng)前進(jìn)度顏色,和背景進(jìn)度顏色

(2)有圓角

(3)點(diǎn)擊后,有擴(kuò)散的水波紋效果,然后從百分之一百回到當(dāng)前進(jìn)度




大概要點(diǎn)就是這些。下面開(kāi)始定義要素。

(1)有一個(gè)狀態(tài)變量,是控制進(jìn)度條的狀態(tài)的,例如說(shuō)默認(rèn)狀態(tài),選中狀態(tài),非選中狀態(tài)

(2)控制顏色的變量

(3)進(jìn)度條的值

(4)點(diǎn)擊時(shí)候的參數(shù)




再者,我們需要思考一下問(wèn)題:

(1)默認(rèn)情況,是沒(méi)有進(jìn)度的,所以只需要繪制一個(gè)默認(rèn)的背景即可

(2)非選中狀態(tài),進(jìn)度條是從0開(kāi)始到目標(biāo)值的,中間有個(gè)過(guò)渡的動(dòng)畫(huà)

(3)選中狀態(tài),先觸發(fā)水波紋動(dòng)畫(huà),當(dāng)動(dòng)畫(huà)到達(dá)最長(zhǎng)邊的時(shí)候,則會(huì)有消失,然后播放進(jìn)度條動(dòng)畫(huà)

實(shí)現(xiàn)

(1)水波紋
直接使用canvas中的drawCircle方法繪制即可,通過(guò)ValueAnimator進(jìn)行半徑的變化,然后即可實(shí)現(xiàn)

(2)普通從0-xx的進(jìn)度條動(dòng)畫(huà),也是通過(guò)ValueAnimator進(jìn)行控制即可

(3)基于(2)的基礎(chǔ)上,如果進(jìn)度條從100-xx也是通過(guò)ValueAnimator變化即可。

整體繪制實(shí)現(xiàn),都需要放到onDraw方法中,通過(guò)標(biāo)識(shí)(Boolean)的控制,控制繪制的方法,繪制不同的效果,onDraw核心代碼如下:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!hadInit()) {
            return;
        }
        if (getStatus() == TYPE_STATUS_DEFAULT) {
            drawBgInfo(canvas);
            return;
        }
        if (!needDraw()) {
            return;
        }
        if (!needAnim()) {
            drawChangeBg(canvas);
            //不需要?jiǎng)赢?huà),直接畫(huà)進(jìn)度條
            drawProgressInfo(canvas);
            return;
        }
        //繪制順序:
        //非選中模式,進(jìn)度條慢慢疊加,直到進(jìn)度值
        //選中模式,水波紋填充后,進(jìn)度條漸漸顯示,數(shù)值從100退回到目標(biāo)值
        if (mDrawingRipple) {
            //繪制水波紋
            drawRippleInfo(canvas);
        }
        if (mDrawingCustomBg) {
            //繪制修改后的背景
            drawChangeBg(canvas);
        }
        if (mDrawingProgress) {
            //繪制進(jìn)度條
            drawProgressInfo(canvas);
        }
    }

注意

(1)對(duì)于動(dòng)畫(huà)的實(shí)現(xiàn),用到了ValueAnimator,注意釋放的時(shí)機(jī)

(2)對(duì)于recyclerview中使用該進(jìn)度條控件,請(qǐng)注意復(fù)用問(wèn)題

(3)對(duì)于進(jìn)度條的值換算,通過(guò)實(shí)際px值換算即可

(4)對(duì)于圓角,在繪制的過(guò)程中,你會(huì)發(fā)現(xiàn)低進(jìn)度的情況(1%)圓角失效,
同時(shí),網(wǎng)上大部分自定義進(jìn)度條也是的,這里就不一一放出他們的博客地址了。實(shí)現(xiàn)方法有很多,我這里是直接使用clipPath后再繪制。

就這么多,鏈接在下面

that's all----------------------------------------------------

類名:

SelectionProgressHorizontalBarView

SelectionProgressVerticalBarView

代碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容