Java - Android 自定義控件之圓形進(jìn)度條

Author: YugeCse
Date: 2014.06.12

psb (1).jpg
package com.kaiju.kaiju.usercontrols;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

public class CircleProgressBar extends View {

    private Context context;
    private Paint paint;
    private float radius = 40f;
    private float ringRadius = 10f;
    private int progress = 0;
    private int max = 100;
    private int circleColor = Color.GRAY;
    private int progressColor = Color.parseColor("#feb239");
    
    public CircleProgressBar(Context context){
        super(context);
        init();
    }
    
    public CircleProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    
    public void init(){
        paint = new Paint();
        paint.setAntiAlias(true);
    }
    
        //設(shè)置默認(rèn)圓環(huán)顏色
    public void setCircleColor(int color){
        this.circleColor = color;
        this.invalidate();
    }
    
    public int getCircleColor(){
        return this.circleColor;
    }
    
        //設(shè)置進(jìn)度條顏色
    public void setProgressColor(int color){
        this.progressColor = color;
        this.invalidate();
    }
    
    public int getProgressColor(){
        return this.progressColor;
    }
    
       //設(shè)置圓環(huán)半徑
    public void setRingRadius(float radius){
        this.ringRadius = radius;
        this.invalidate();
    }
    
    public float getRingRadius(){
        return this.ringRadius;
    }
    
    public void setRadius(float radius){
        this.radius = radius;
        this.invalidate();
    }
    
    public float getRadius(){
        return this.radius;
    }
    
        //設(shè)置最大值
    public void setMax(int value){
        this.max = value;
    }
    
    public int getMax(){
        return this.max;
    }
    
        //設(shè)置當(dāng)前進(jìn)度值
    public void setProgress(int progress){
        this.progress = progress;
        this.invalidate();
    }
    
    public int getProgress(){
        return this.progress;
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onDraw(Canvas canvas) {
                //獲取控件測量的寬度高度
        int width = getMeasuredWidth();
        int height = getMeasuredHeight();
        super.onDraw(canvas);
               //設(shè)置畫筆參數(shù)
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10f);
        paint.setColor(circleColor);
                //繪制最大圓
        canvas.drawArc(new RectF((width-radius*2)/2+2,(height-radius*2)/2,radius*2,radius*2), 270, 360, false, paint);
        paint.setColor(progressColor);
                //繪制內(nèi)圓
        canvas.drawArc(new RectF((width-radius*2)/2+2,(height-radius*2)/2,radius*2,radius*2), 270, (float)progress/max*360, false, paint);
        paint.setColor(Color.BLUE);
        String value = (int)(((float)progress/max)*100)+"%";
        float widthText = 0f;
        float[] widths = new float[value.length()];
        for(int i=0;i<widths.length;i++) widthText+=widths[i];
                //繪制進(jìn)度顯示的文本
        paint.reset();
        paint.setAntiAlias(true);
        paint.setTextSize(25f);
        paint.getTextWidths(value, widths);
        FontMetrics fm = paint.getFontMetrics();
        paint.setTextAlign(Align.CENTER);
        canvas.drawText(value,(width-widthText)/2, (height-(Math.abs(fm.descent)-Math.abs(fm.ascent)))/2, paint);
        paint.reset();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int genericValue = +MeasureSpec.makeMeasureSpec((int)(radius*2+ringRadius), MeasureSpec.EXACTLY);
        int width = getPaddingLeft()+getPaddingRight()+ genericValue;
        int height = getPaddingTop()+getPaddingBottom()+ genericValue;
        super.onMeasure(width, height);
        super.setMeasuredDimension(width, height);
    }

}

掌握這方面的自定義控件鞠眉,主要的就是掌握Canvas的繪圖函數(shù)爆惧,已經(jīng)如何通過使用變量來控制繪圖屑那。這種進(jìn)度條的繪制應(yīng)該也算是最基本的了吧哈踱,哈哈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末为障,一起剝皮案震驚了整個濱河市晦闰,隨后出現(xiàn)的幾起案子放祟,更是在濱河造成了極大的恐慌鳍怨,老刑警劉巖呻右,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鞋喇,居然都是意外死亡声滥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門侦香,熙熙樓的掌柜王于貴愁眉苦臉地迎上來落塑,“玉大人,你說我怎么就攤上這事罐韩『读蓿” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵散吵,是天一觀的道長龙考。 經(jīng)常有香客問我,道長矾睦,這世上最難降的妖魔是什么晦款? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮枚冗,結(jié)果婚禮上缓溅,老公的妹妹穿的比我還像新娘。我一直安慰自己赁温,他們只是感情好坛怪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著股囊,像睡著了一般袜匿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毁涉,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天沉帮,我揣著相機(jī)與錄音,去河邊找鬼贫堰。 笑死穆壕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的其屏。 我是一名探鬼主播喇勋,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偎行!你這毒婦竟也來了川背?” 一聲冷哼從身側(cè)響起贰拿,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熄云,沒想到半個月后膨更,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缴允,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年荚守,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片练般。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡矗漾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薄料,到底是詐尸還是另有隱情敞贡,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布摄职,位于F島的核電站誊役,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琳钉。R本人自食惡果不足惜势木,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歌懒。 院中可真熱鬧啦桌,春花似錦、人聲如沸及皂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽验烧。三九已至板驳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碍拆,已是汗流浹背若治。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留感混,地道東北人端幼。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像弧满,于是被迫代替她去往敵國和親婆跑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程庭呜,因...
    小菜c閱讀 6,409評論 0 17
  • 德云社的前身是“北京相聲大會”滑进,從“四老時期”到“德云四少”犀忱,再到如今的“德云一哥”,風(fēng)風(fēng)雨雨31載扶关。人走人留阴汇,歲...
    admiremoon閱讀 1,749評論 5 6
  • 一帆 1040年,英國考文垂市的利奧夫里克伯爵迎娶了葛黛瓦為妻驮审。葛黛瓦夫人貌美如花鲫寄,氣質(zhì)端莊典雅吉执,人們都對她十分傾...
    05282adfe066閱讀 1,066評論 0 0
  • 簡介 : 巨蟹桃和她處女媽 之間的“小摩擦” 以及各種座的盆友們疯淫。。本故事都是根據(jù)真實(shí)生活改編的哦戳玫,各位不要對號入...
    7aozi閱讀 215評論 0 0