ProgressBar:使用上的一點(diǎn)小擴(kuò)展

以往在使用ProgressBar的時候幻捏,大多數(shù)都是下面兩種情況


圖1.加載框模式.gif

數(shù)據(jù)加載或者其他耗時操作的時候囤攀,使用ProgressBar給出一個正在加載的提示框


圖2.進(jìn)度條模式.png

或者下載的時候贴谎,顯示一下當(dāng)前正在下載的進(jìn)度情況斤富。

最近在項目需求中,產(chǎn)品提了一個新的需求裸弦,如下


圖3.需求圖.png

很簡單的一個頁面,只是驯击,“空吸剩余”這一項有點(diǎn)不一樣烁兰。首先想到的就是ProgressBar的進(jìn)度條樣式

趕緊xml文件里放上一個看看

  <ProgressBar
    style="@android:style/Widget.ProgressBar.Horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:progress="50"/>
ProgressBar.png

樣子看起來很接近需求的樣式,只是有3個地方需要修改徊都,

<1>.進(jìn)度條中間需要加上一個當(dāng)前進(jìn)度的文字描述
<2>.進(jìn)度條的當(dāng)前進(jìn)度顏色和背景色
<3>.左右兩端的圓角弧度沪斟;

明白了需求后,接下來就是動手在原有ProgressBar基礎(chǔ)上進(jìn)行修改暇矫。在平時ProgressBar的使用中主之,圖1和圖2樣式上的差距,是因為設(shè)置的這一句代碼
style="@android:style/Widget.ProgressBar.Horizontal"
直接點(diǎn)進(jìn)去可以看到系統(tǒng)已經(jīng)為我們設(shè)置好的一段Style

 <style name="Widget.ProgressBar.Horizontal">
        <item name="indeterminateOnly">false</item>
        <item name="progressDrawable">@drawable/progress_horizontal</item>
        <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal</item>
        <item name="minHeight">20dip</item>
        <item name="maxHeight">20dip</item>
        <item name="mirrorForRtl">true</item>
    </style>

這里不對ProgressBar的基本屬性進(jìn)行解釋了李根,如果有不太了解的槽奕,可以查看官方文檔或者百度
根據(jù)圖3需求的樣式,需要重點(diǎn)關(guān)注的是Style里的
<item name="progressDrawable">@drawable/progress_horizontal</item>
的這一句代碼房轿,再次點(diǎn)進(jìn)去查看它的詳細(xì)代碼

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"/>
        </shape>
    </item>
    
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#80ffd300"
                        android:centerColor="#80ffb600"
                        android:centerY="0.75"
                        android:endColor="#a0ffcb00"
                        android:angle="270"/>
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"/>
            </shape>
        </clip>
    </item>
</layer-list>

系統(tǒng)是通過圖層的方式粤攒,在每個 <Item /> 中從上倒下依次對應(yīng)ProgressBar的

android:background
android:secondaryProgress
android:progress

三個屬性進(jìn)行的設(shè)置。

根據(jù)需求的樣式囱持,我們要對ProgressBar做出修改夯接,也可以參照這段代碼進(jìn)行修改,從需求圖中可以看出纷妆,并不需要android:secondaryProgress 屬性的樣式盔几,所以,只修改android:background和android:progress兩個屬性就夠用了掩幢。需求中的進(jìn)度條底色是純色逊拍,上面的藍(lán)色進(jìn)度是一個由底部到頂部的藍(lán)色漸變,所以际邻,仿照系統(tǒng)的樣式芯丧,在結(jié)合需求,在drawable下自定義一個圖層樣式文件shape_inner_progressbar.xml


<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="8dip"/>
            <solid android:color="#4E4562"/>
        </shape>
    </item>

    <item
        android:id="@android:id/progress"
        android:bottom=".5dp"
        android:left=".5dp"
        android:right=".5dp"
        android:top=".5dp">
        <clip>
            <shape>
                <corners android:radius="8dip"/>
                <gradient
                    android:angle="90"
                    android:endColor="#b2d8ff"
                    android:startColor="#1a85f2"/>
            </shape>
        </clip>
    </item>
</layer-list>

然后在 values/styles.xml 下定義一個Style

  <style name="InnerProgress" parent="android:Widget.ProgressBar.Horizontal">
        <item name="android:progressDrawable">@drawable/shape_inner_progressbar</item>
    </style>

在activity的xml中使用

<ProgressBar
       android:layout_width="match_parent"
       style="@style/InnerProgress"
       android:progress="60"
       android:layout_centerInParent="true"
       android:layout_height="wrap_content"/>

運(yùn)行起來看一下效果世曾,
InnerProgress.png

自我感覺很是良好注整。

現(xiàn)在就差最后一步,在進(jìn)度條中間設(shè)置當(dāng)前進(jìn)度的百分比數(shù)值。這里就不能直接通過屬性值設(shè)置了肿轨,需要繼承ProgressBar并且重寫它的onDraw方法寿冕,然后通過getProgress()方法拿到它當(dāng)前進(jìn)度并且繪制在進(jìn)度條中間位置,也很簡單椒袍,代碼如下

public class InnerProgressBar extends ProgressBar {
    private Paint mPaint;
    private Rect mRect;

    public InnerProgressBar (Context context) {
        super (context);
        init ();
    }

    public InnerProgressBar (Context context, AttributeSet attrs) {
        super (context, attrs);
        init ();
    }

    private void init () {
        mPaint = new Paint (Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor (Color.WHITE);
        mPaint.setTextAlign (Paint.Align.CENTER);
        mPaint.setTextSize (35);
        mRect = new Rect ();
    }

    @Override
    protected synchronized void onDraw (Canvas canvas) {
        super.onDraw (canvas);
        String text = String.valueOf (getProgress ()) + "%";
        mPaint.getTextBounds (text, 0, text.length (), mRect);
        canvas.drawText (text, getWidth () / 2, getHeight () / 2 + mRect.height () / 2, mPaint);
    }
}

這里需要注意一點(diǎn)的是驼唱,為了在Y軸方向上也保持文字居中,需要拿到文字高度的一半驹暑,通過和getHeight () / 2一起的和作為繪制文字的Y坐標(biāo)玫恳,至此,整個效果就出來了优俘,上圖:


最終效果.png

整體代碼看起來很簡單京办,只是以前從沒深入的去了解過ProgressBar,都是直接使用它的原生效果帆焕,導(dǎo)致一直覺得這是一個使用方式很單一的控件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惭婿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叶雹,更是在濱河造成了極大的恐慌财饥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件折晦,死亡現(xiàn)場離奇詭異钥星,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)满着,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門谦炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人风喇,你說我怎么就攤上這事宁改。” “怎么了响驴?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵透且,是天一觀的道長撕蔼。 經(jīng)常有香客問我豁鲤,道長,這世上最難降的妖魔是什么鲸沮? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任琳骡,我火速辦了婚禮,結(jié)果婚禮上讼溺,老公的妹妹穿的比我還像新娘楣号。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布炫狱。 她就那樣靜靜地躺著藻懒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪视译。 梳的紋絲不亂的頭發(fā)上嬉荆,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音酷含,去河邊找鬼鄙早。 笑死,一個胖子當(dāng)著我的面吹牛椅亚,可吹牛的內(nèi)容都是我干的限番。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呀舔,長吁一口氣:“原來是場噩夢啊……” “哼弥虐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起别威,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躯舔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后省古,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粥庄,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年豺妓,在試婚紗的時候發(fā)現(xiàn)自己被綠了惜互。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡琳拭,死狀恐怖训堆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情白嘁,我是刑警寧澤坑鱼,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站絮缅,受9級特大地震影響鲁沥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耕魄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一画恰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吸奴,春花似錦允扇、人聲如沸缠局。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狭园。三九已至,卻和暖如春糊治,著一層夾襖步出監(jiān)牢的瞬間妙啃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工俊戳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揖赴,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓抑胎,卻偏偏與公主長得像燥滑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阿逃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,113評論 25 707
  • 一铭拧、前言 轉(zhuǎn)眼就到了十一國慶佳節(jié)了,看了看上次的動態(tài)恃锉,已經(jīng)過去快一個月了搀菩。并不是因為自己沒有堅持而中斷了寫文章,真...
    孟校長閱讀 6,882評論 7 28
  • 青春仿佛是一種宣言破托,它昭示著自古英雄出少年的激情;青春也是一種姿態(tài)肪跋,心有猛虎,細(xì)嗅薔薇;青春也是一種勇氣土砂,帶著加速...
    京墨書香閱讀 200評論 0 3
  • 看完《金粉世家》州既,像吃了一顆糖,有點(diǎn)甜萝映,哈哈吴叶,先知曉故事結(jié)局,看起來波瀾不驚序臂。將時間對半劈蚌卤,邊寫著論文邊...
    陳南渡閱讀 674評論 0 2
  • 生活就是一趟旅行逊彭,可惜我們常常忘記這點(diǎn),以為他鄉(xiāng)是故鄉(xiāng)吭练。 我們總以為我們看到的是真相诫龙,可我們看到的真相析显,只有千百萬...
    Ken001閱讀 275評論 0 0