018android初級篇之自定義圓形進(jìn)度條

項目需要倔丈,需要一個圓形的進(jìn)度條,所想到的實現(xiàn)方案是這樣的:
自定義View扼倘,訂制一個圓形的進(jìn)度條。下面簡述實現(xiàn)除呵,有不當(dāng)之處敬請指正再菊。

主題思想

  1. 自定義類繼承自View,在構(gòu)造函數(shù)中颜曾,獲得從配置文件中獲得的自定義屬性值纠拔。
  2. 在onDraw中繪制,跟據(jù)獲得的屬性值泛豪,繪制想要的圖形稠诲。

自定義屬性的定義

在文件attrs.xml中

<resources>
    <declare-styleable name="RoundProgressBar">  
        <attr name="roundColor" format="color"/>
        <attr name="roundProgressColor" format="color"/>
        <attr name="roundWidth" format="dimension"></attr>
        <attr name="textColor" format="color" />  
        <attr name="textSize" format="dimension" /> 
        <attr name="max" format="integer"></attr> 
        <attr name="textIsDisplayable" format="boolean"></attr>
        <attr name="style">
            <enum name="STROKE" value="0"></enum>
            <enum name="FILL" value="1"></enum>
        </attr>
    </declare-styleable> 
</resources>

則,在layout文件中诡曙,可以使用這些自定義屬性:

<com.running.aid.aidrunning.RoundProgressBar
    android:id="@+id/roundProgressBar"
    android:layout_width="250dip"
    android:layout_height="250dip"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="78dp"
    android:layout_centerHorizontal="true"


    android_custom:roundColor="#D1D1D1"
    android_custom:roundProgressColor="@android:color/holo_green_light"
    android_custom:textColor="@color/gray9"
    android_custom:roundWidth="25dip"
    android_custom:textSize="18sp" />

在自定義的進(jìn)度條類的構(gòu)造函數(shù)中臀叙,獲取配置的自定義屬性值:

roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);
roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);
textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.GREEN);
textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);
roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 5);
max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);
textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);
style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);

繪制控件

畫最外層的大圓環(huán)

    int centre = getWidth()/2; //獲取圓心的x坐標(biāo)
    int radius = (int) (centre - roundWidth/2); //圓環(huán)的半徑
    paint.setColor(roundColor); //設(shè)置圓環(huán)的顏色
    paint.setStyle(Paint.Style.STROKE); //設(shè)置空心
    paint.setStrokeWidth(roundWidth); //設(shè)置圓環(huán)的寬度
    paint.setAntiAlias(true);  //消除鋸齒
    canvas.drawCircle(centre, centre, radius, paint); //畫出圓環(huán)

繪制文本

這里是模仿計步器,顯示的當(dāng)前步數(shù)价卤,總步數(shù)劝萤,分三行顯示。

paint.setStrokeWidth(0);
paint.setColor(textColor);
paint.setTextSize(textSize);
paint.setTypeface(Typeface.DEFAULT_BOLD); //設(shè)置字體

//if(textIsDisplayable && percent != 0 && style == STROKE){
if(textIsDisplayable && style == STROKE){
    stepNumValueStr = "" + currentValue;
    stepAIMValueStr = "" + maxValue;
    float stepNumStrWidth = paint.measureText(stepNumStr);
    
    float stepAIMStrWidth = paint.measureText(stepAIMStr+stepAIMValueStr);
    float y = paint.getFontMetrics().bottom - paint.getFontMetrics().top;
    canvas.drawText(stepNumStr,centre-stepNumStrWidth/2,centre -2*y,paint);
    canvas.drawText(stepAIMStr+stepAIMValueStr,centre-stepAIMStrWidth/2,centre+2*y,paint);
    
    paint.setTextSize(textSize * 2);
    paint.setColor(getResources().getColor(R.color.blue6));
    float stepNumValueStrWidth = paint.measureText(stepNumValueStr);
    canvas.drawText(stepNumValueStr,centre-stepNumValueStrWidth/2,centre,paint);


}

繪制扇形慎璧,進(jìn)度條

    paint.setStrokeWidth(roundWidth); //設(shè)置圓環(huán)的寬度
    paint.setColor(roundProgressColor);  //設(shè)置進(jìn)度的顏色
    RectF oval = new RectF(centre - radius, centre - radius, centre
            + radius, centre + radius);  //用于定義的圓弧的形狀和大小的界限

    switch (style) {
        case STROKE:{
            paint.setStyle(Paint.Style.STROKE);
            canvas.drawArc(oval, 0, 360 * progress / max, false, paint);  //根據(jù)進(jìn)度畫圓弧
            break;
        }
        case FILL:{
            paint.setStyle(Paint.Style.FILL_AND_STROKE);
            if(progress !=0)
                canvas.drawArc(oval, 0, 360 * progress / max, true, paint);  //根據(jù)進(jìn)度畫圓弧
            break;
        }
    }

參考鏈接

  1. 017android初級篇之a(chǎn)ndroid canvas的使用
  2. Android 高手進(jìn)階之自定義View床嫌,自定義屬性(帶進(jìn)度的圓形進(jìn)度條)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胸私,隨后出現(xiàn)的幾起案子厌处,更是在濱河造成了極大的恐慌,老刑警劉巖岁疼,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阔涉,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洒敏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門龄恋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凶伙,你說我怎么就攤上這事郭毕。” “怎么了函荣?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵显押,是天一觀的道長。 經(jīng)常有香客問我傻挂,道長乘碑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任金拒,我火速辦了婚禮兽肤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绪抛。我一直安慰自己资铡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布幢码。 她就那樣靜靜地躺著笤休,像睡著了一般。 火紅的嫁衣襯著肌膚如雪症副。 梳的紋絲不亂的頭發(fā)上店雅,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音贞铣,去河邊找鬼闹啦。 笑死,一個胖子當(dāng)著我的面吹牛辕坝,可吹牛的內(nèi)容都是我干的亥揖。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼圣勒,長吁一口氣:“原來是場噩夢啊……” “哼费变!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起圣贸,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤挚歧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吁峻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滑负,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡在张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矮慕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帮匾。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖痴鳄,靈堂內(nèi)的尸體忽然破棺而出瘟斜,到底是詐尸還是另有隱情,我是刑警寧澤痪寻,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布螺句,位于F島的核電站,受9級特大地震影響橡类,放射性物質(zhì)發(fā)生泄漏蛇尚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一顾画、第九天 我趴在偏房一處隱蔽的房頂上張望取劫。 院中可真熱鬧,春花似錦研侣、人聲如沸勇凭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寓盗,卻和暖如春灌砖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傀蚌。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工基显, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人善炫。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓撩幽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箩艺。 傳聞我的和親對象是個殘疾皇子窜醉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

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