原文出处:http://www.ccbu.cc/android/progressbar-intro

ProgressBar是Android系统提供的进度条view控件。

  1. ProgressBar有两个进度,一个是Android:progress,另一个是android:secondaryProgress。后者主要是为缓存需要所涉及的,比如在看网络视频时候都会有一个缓存的进度条以及还要一个播放的进度,在这里缓存的进度就可以是android:secondaryProgress,而播放进度就是android:progress,有了secondProgress,可以很方便定制ProgressBar。

  2. ProgressBar分为确定的和不确定的,确定的是我们能明确看到进度,相反不确定的就是不清楚、不确定一个操作需要多长时间来完成,这个时候就需要用的不确定的ProgressBar了。属性android:indeterminate如果设置为true的话,那么ProgressBar就可能是圆形的滚动条或者水平的滚动条(由样式决定),但是我们一般时候,是直接使用Style类型来区分圆形还是水平ProgressBar的。

  3. ProgressBar的样式设定其实有两种方式,在API文档中说明的方式如下:

    • Widget.ProgressBar.Horizontal
    • Widget.ProgressBar.Small
    • Widget.ProgressBar.Large
    • Widget.ProgressBar.Inverse
    • Widget.ProgressBar.Small.Inverse
    • Widget.ProgressBar.Large.Inverse

    使用的时候可以这样:style="@android:style/Widget.ProgressBar.Small",另外还有一种方式就是使用系统的attr,下面的方式是系统的style:

    • style="?android:attr/progressBarStyle"
    • style="?android:attr/progressBarStyleHorizontal"
    • style="?android:attr/progressBarStyleInverse"
    • style="?android:attr/progressBarStyleLarge"
    • style="?android:attr/progressBarStyleLargeInverse"
    • style="?android:attr/progressBarStyleSmall"
    • style="?android:attr/progressBarStyleSmallInverse"
    • style="?android:attr/progressBarStyleSmallTitle"

    示例如下:

  
  1. 水平ProgressBar系统样式

    我们去看一下style="?android:attr/progressBarStyleHorizontal"(即Widget.ProgressBar.Horizontal)的源码,如下:

      

可以看出,进度条显示的绘制Drawable定义主要是android:progressDrawable,让我们看一下progress_horizontal的源码。

<?xml version="1.0" encoding="utf-8"?>                                                                                                                                                                                                                                                                                      

可以看出,此处通过一个layer-list定义了一个LayerDrawable来处理进度的绘制,其中绘制包括3部分,即:background、secondProgress、progress,知道了绘制原理,那我们就可以很轻松的进行定义自己的进度条样式了。

如我们需要定义一个进度条,不需要绘制secondProgress,背景为透明,进度为红色填充,那么我们的定义如下的Drawable资源progress_bar_style.xml。

                                                                                                    

再在layout的xml配置中进行一下配置即可

  1. 水平ProgressBar使用图片作为进度条

    <?xml version="1.0" encoding="utf-8"?>                                                

    一般的,背景图片需要是.9.png格式,progress则可以为普通图片,当普通图片出现问题时,可以尝试使用.9.png来代替,需要注意的是,progress的资源需要放在clip标签内,将其转换为ClipDrawable来使用,才可以正常的显示进度。

  2. 弧形进度条样式
    以progressBarStyleLarge为例,其样式源码如下: