自定義View之線性百分比進(jìn)度條

先上效果圖再分析:


效果圖

從圖中可以看到本view支持兩種不同的類型進(jìn)度展示揪罕,一種是進(jìn)度百分比直接用textview展示,另一種加了矩形背景缸逃。第一種沒什么難度耕突,本文就以第二種為例講解一下,一步一步實(shí)現(xiàn)羡蛾,你會(huì)發(fā)現(xiàn)原來很簡單漓帅。

 // 線的X起始左標(biāo)
   // private float startX;
  //  private float endX;
//private float pading = 100f; // 左右邊距
 @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w;
        height = h;
        startX = paintWidth+pading;
        endX = width -pading;
    }
  @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 根據(jù) progress進(jìn)度 ,獲得X坐標(biāo)
         lenth = (endX*progress/100)+startX-(progress/100*(startX));
        // 底部背景線
       canvas.drawLine(startX,height/2,endX,height/2,paint);
        // 畫 進(jìn)度線
       drawLine(canvas);
        if (type==1){
            // 不帶矩形的進(jìn)度
            drawText(canvas);
        }else if (type==2){
            // 畫帶三角形的矩形進(jìn)度條
            drawRecText(canvas);

        }
    }

首先在onSizeChanged方法中測量view寬高和線的起始位置痴怨,在onDraw方法中進(jìn)行類型判斷和根據(jù) progress進(jìn)度 獲得X坐標(biāo)忙干,然后開始畫圖。

第一步畫背景線

// 底部背景線
canvas.drawLine(startX,height/2,endX,height/2,paint);
背景

第二步 畫進(jìn)度線并實(shí)現(xiàn)動(dòng)畫效果

先畫線

 canvas.drawLine(startX,height/2,lenth,height/2,mPaint);

動(dòng)畫效果

// 設(shè)置進(jìn)度
    public void setProgress(int mprogress) {
        ValueAnimator anim = ValueAnimator.ofFloat(0, mprogress);
        anim.setDuration(3000);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                progress = (float) animation.getAnimatedValue();
                invalidate();
            }
        });
        anim.start();
    }

根據(jù)ValueAnimator 獲取progress值浪藻,連續(xù)調(diào)用invalidate()進(jìn)行重繪捐迫。

bbb.gif

第三步實(shí)現(xiàn)畫矩形和內(nèi)部文字

String text =(int) progress+"%";

        ttPaint.getTextBounds(text, 0, text.length(), tTextRect);
        float TextHeight = tTextRect.height();
        float TextWidth = tTextRect.width();

        tRect.set((int)(lenth-TextWidth/2-4f),(int)(height/2-2*TextHeight-6f),(int)(lenth+TextWidth/2+4f),(int)(height/2-TextHeight));
        // 畫矩形
        canvas.drawRect(tRect,recPaint);

        Paint.FontMetricsInt fontMetrics = ttPaint.getFontMetricsInt();
        // 獲取baseLine
        int baseline = tRect.top + (tRect.bottom - tRect.top - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
        ttPaint.setTextAlign(Paint.Align.CENTER);
        canvas.drawText(text,tRect.centerX(),baseline, ttPaint);

首先獲取文本內(nèi)容寬高,然后根據(jù)文本的寬高設(shè)置矩形的初始位置爱葵,并畫出施戴,為了不讓文字緊貼矩形這里適當(dāng)調(diào)整一下矩形寬高反浓,然后在矩形的中心畫出文本內(nèi)容 。

rrrrr.gif

第四步 畫三角形

// 畫三角形
        path.moveTo(lenth, (float) (height/2-0.7*TextHeight));
        path.lineTo((float) (lenth-0.15*TextWidth),  height / 2-TextHeight);
        path.lineTo((float) (lenth+0.15*TextWidth), height / 2-TextHeight);
        canvas.drawPath(path, recPaint);
        path.reset();

注意: 如果你問我上邊方法的百分比為什么是0.15和0.7的話我會(huì)明確的告訴你我不知道T藁@自颉!三角型的大小需要根據(jù)矩形的大小和位置來調(diào)整肪笋,只到你認(rèn)為合適為止月劈,所以你可以隨意更改三角形的起始y坐標(biāo),連接的X坐標(biāo)也可以隨便更改涂乌,所以這里的百分比只是我自己調(diào)試看著順眼艺栈。英岭。湾盒。

eeeee.gif

項(xiàng)目地址:
csdn:http://download.csdn.net/download/qq_38367802/10172775
github:https://github.com/liuzhenhang/myview

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诅妹,隨后出現(xiàn)的幾起案子罚勾,更是在濱河造成了極大的恐慌,老刑警劉巖吭狡,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尖殃,死亡現(xiàn)場離奇詭異,居然都是意外死亡划煮,警方通過查閱死者的電腦和手機(jī)送丰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弛秋,“玉大人器躏,你說我怎么就攤上這事⌒仿裕” “怎么了登失?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挖炬。 經(jīng)常有香客問我揽浙,道長,這世上最難降的妖魔是什么意敛? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任馅巷,我火速辦了婚禮,結(jié)果婚禮上草姻,老公的妹妹穿的比我還像新娘钓猬。我一直安慰自己,他們只是感情好碴倾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布逗噩。 她就那樣靜靜地躺著掉丽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪异雁。 梳的紋絲不亂的頭發(fā)上捶障,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音纲刀,去河邊找鬼项炼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛示绊,可吹牛的內(nèi)容都是我干的锭部。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼面褐,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼拌禾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起展哭,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤湃窍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后匪傍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體您市,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年役衡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茵休。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡手蝎,死狀恐怖榕莺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柑船,我是刑警寧澤帽撑,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站鞍时,受9級(jí)特大地震影響亏拉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逆巍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一及塘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锐极,春花似錦笙僚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亿笤。三九已至,卻和暖如春栋猖,著一層夾襖步出監(jiān)牢的瞬間净薛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國打工蒲拉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肃拜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓雌团,卻偏偏與公主長得像燃领,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锦援,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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