Android自定義view-圓形百分比進度條效果

一、概述

  今天接著研究paint畫筆极阅,實現(xiàn)圓環(huán)百分比進度變化效果胃碾,效果圖如下:
進度條.gif

二、思路分析

這個效果其實和前面的qq計步器實現(xiàn)思路差不多筋搏,那個是兩個圓弧仆百,這個里面是不動的圓形,外面是圓弧奔脐。

2.1自定義屬性

自定義屬性包含內(nèi)圓畫筆的顏色俄周,畫筆描邊的粗細,外面圓弧的畫筆顏色髓迎,里面中間百分比文字的大小和顏色峦朗。
attrs文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CircleProgressView">
        <attr name="innerCicleColor" format="color"></attr>
        <attr name="outCicleColor" format="color"></attr>
        <attr name="roundWidth" format="dimension"></attr>
        <attr name="progressTextColor" format="color"></attr>
        <attr name="progressTextSize" format="dimension"></attr>
    </declare-styleable>
</resources>

自定義類構(gòu)造函數(shù)

 //獲取屬性
    public CircleProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CircleProgressView);
        mInnerColor = a.getColor(R.styleable.CircleProgressView_innerCicleColor,mInnerColor);
        mOutColor = a.getColor(R.styleable.CircleProgressView_outCicleColor,mOutColor);
        mRoundWidth = (int)a.getDimension(R.styleable.CircleProgressView_roundWidth,dp2px(mRoundWidth));
        mTextSize = a.getDimensionPixelSize(R.styleable.CircleProgressView_progressTextSize,sp2px(mTextSize));
        a.recycle();
        mInnerPaint = new Paint();
        mInnerPaint.setColor(mInnerColor);
        mInnerPaint.setAntiAlias(true); //抗鋸齒
        mInnerPaint.setStrokeWidth(mRoundWidth);
        mInnerPaint.setStyle(Paint.Style.STROKE); //空心圓

        mOutPaint = new Paint();
        mOutPaint.setColor(mOutColor);
        mOutPaint.setAntiAlias(true); //抗鋸齒
        mOutPaint.setStrokeWidth(mRoundWidth);
        mOutPaint.setStyle(Paint.Style.STROKE); //空心圓

        mTextPaint = new Paint();
        mTextPaint.setTextSize(mTextSize);
        mTextPaint.setColor(mTextColor);
    }

2.2在ondraw方法中繪制

  //繪制
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //繪制內(nèi)圓
        int center = getWidth()/2;
        canvas.drawCircle(center,center,center-mRoundWidth/2,mInnerPaint);
        //繪制外圓
        RectF rectF = new RectF(mRoundWidth/2,mRoundWidth/2,getWidth()-mRoundWidth/2,getHeight()-mRoundWidth/2);
        if (mCurrentProgress == 0){
            return;
        }

        float percent = (float)mCurrentProgress/mMax;
        canvas.drawArc(rectF,0,percent*360,false,mOutPaint); //false 表示不包括圓心

        //繪制文字
        String textString = ((int)(percent*100))+"%";
//        String textString = (mMax - (mCurrentProgress-1))+"";
        Rect bounds = new Rect();
        mTextPaint.getTextBounds(textString,0,textString.length(),bounds);
        int dy = (mTextPaint.getFontMetricsInt().bottom-mTextPaint.getFontMetricsInt().top)/2-mTextPaint.getFontMetricsInt().bottom;
        int baseLine = getHeight()/2 + dy;
        canvas.drawText(textString,getWidth()/2-bounds.width()/2,baseLine,mTextPaint);
    }

對圓的半徑的計算不理解的可以參考這邊文章:
Canvas drawCircle Rect邊框問題
onmeasure方法就不介紹了,前面說了很多了排龄。

2.3暴露給用戶方法動態(tài)改變百分比的值

   //暴露給外面調(diào)用 設(shè)置當前值 不斷調(diào)用ondraw方法
    public synchronized void setCurrentProgress(int currentProgress) {
        this.mCurrentProgress = currentProgress;
        invalidate();
    }

在mainActivity中用設(shè)置屬性動畫波势,監(jiān)聽值的變化,調(diào)用此方法橄维,繪制界面:

circleProgressView.setMax(4000);
        ValueAnimator objectAnimator = ObjectAnimator.ofFloat(1,4000);
        objectAnimator.setDuration(5000);
        objectAnimator.start();
        objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float progress = (float) animation.getAnimatedValue();
                circleProgressView.setCurrentProgress((int) progress);
            }
        });

三尺铣、結(jié)語

當然,這個效果也可以擴展争舞,你可以做成別的效果凛忿,例如倒計時,代碼稍微改動下就行了竞川。分析完畢店溢,代碼地址:
http://pan.baidu.com/s/1o80TQm2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市流译,隨后出現(xiàn)的幾起案子逞怨,更是在濱河造成了極大的恐慌,老刑警劉巖福澡,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叠赦,死亡現(xiàn)場離奇詭異,居然都是意外死亡革砸,警方通過查閱死者的電腦和手機除秀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算利,“玉大人册踩,你說我怎么就攤上這事⌒茫” “怎么了暂吉?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵胖秒,是天一觀的道長。 經(jīng)常有香客問我慕的,道長阎肝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任肮街,我火速辦了婚禮风题,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嫉父。我一直安慰自己沛硅,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布绕辖。 她就那樣靜靜地躺著摇肌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪引镊。 梳的紋絲不亂的頭發(fā)上朦蕴,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音弟头,去河邊找鬼吩抓。 笑死,一個胖子當著我的面吹牛赴恨,可吹牛的內(nèi)容都是我干的疹娶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼伦连,長吁一口氣:“原來是場噩夢啊……” “哼雨饺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惑淳,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤额港,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后歧焦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體移斩,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年绢馍,在試婚紗的時候發(fā)現(xiàn)自己被綠了向瓷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡舰涌,死狀恐怖猖任,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓷耙,我是刑警寧澤朱躺,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布刁赖,位于F島的核電站,受9級特大地震影響室琢,放射性物質(zhì)發(fā)生泄漏乾闰。R本人自食惡果不足惜落追,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一盈滴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轿钠,春花似錦巢钓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贷腕,卻和暖如春背镇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泽裳。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工瞒斩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涮总。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓胸囱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瀑梗。 傳聞我的和親對象是個殘疾皇子烹笔,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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