在应用中,我们常常需要一些指示性的东西,来提示我们的用户,此时app正在努力做一些操作。在这样的需求下,进度条可以使用ProgressBar
ProgressBar的使用
关键字 Keywords
进度条(ProgresssBar)可视化的指示器(Visual Indicator)次要进度(Secondary Progress)中间进度(Intermediate Progress)不确定的(indeterminate)Chrome Android progressBarAny.Do rogreassBar
概述 Class Overview[1]
进度条(ProgresssBar) 是某些操作中的(操作)进度的可视化的指示器(Visual Indicator)。它通过一个“条(bar)”,向用户呈现操作的进度;当它向前移动的时候,应用程序可以,通过修改bar的长度,改变总进度。此外,它还有一个次要进度(Secondary Progress)可以显示在进度条上,当需要显示中间进度(Intermediate Progress)
进度条也可以是不确定的(indeterminate)。在不确定模式下,进度条显示为一个循环动画,并且没有进度指示器。这种模式常用于应用程序使用任务的长度是未知的时候。不确定进度条可能要么是一个旋转的轮子(A spinning wheel)或者一个水平条(A horizontal bar)。
使用 General Usage
在布局文件中添加一个进度条,需要使用<ProgressBar> 元素。默认情况下,进度条显示为一个旋转的轮子,即为不确定。当然,我们也可以指定进度条的显示样式。接下来,介绍调用Android预定义的ProgressBar的样式的使用和用户自定义ProgressBar的样式的使用。
Android预定义ProgressBar的样式
首先,让我们看看Android给我们预先定义好了ProgressBar的哪些样式。
默认的ProgressBar的样式,是一个中等大小的圆形进度条。
偏小的ProgressBar的样式,是一个相对较小的圆形进度条。
偏大的ProgressBar的样式,是一个相对较大的圆形进度条。
反选的ProgressBar的样式,是一个中等大小的圆形进度条。
“反选的”(Inverse)样式是,在浅颜色的主题(light color theme,即白色背景),提供一种“相反”颜色的进度条。
偏小的、反选的ProgressBar的样式,是一个相对较小的圆形进度条。
偏大的、反选的ProgressBar的样式,是一个相对较大的圆形进度条。
水平的ProgressBar的样式,是一个水平的进度条。
- ?android:attr/progressBarStyleSmallTitle
偏小的ProgressBar的样式,是一个相对较小的圆形进度条,且在标题栏中显示。
然后,让我们看看如何在Layout布局文件中引入ProgressBar。
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
style="?android:attr/progressBarStyleHorizontal"
... />
用户自定义ProgressBar的样式
在我们要实现自定义样式之前,让我们先来了解一下ProgressBar的XML文件中常用属性。
| Attribute Name | Description |
| android:animationResolution | 动画帧与帧之间的时间间隔(毫秒为单位) |
* | android:indeterminate | 是否开启不确定模式( the indeterminate mode) |
| android:indeterminateBehavior | 在不确定模式下,当达到进度的最大值时,该属性规定了该如何变化。该属性对于两个值:repeat 和 cyclic。 repeat :动画将从0开始;(default) cyclic:动画将从最大值回到0。 |
| android:indeterminateDrawable | 在不确定模式下使用的drawable |
| android:indeterminateDuration | 不确定模式持续的时间 |
| android:indeterminateOnly | 限制为不确定模式,控制进度不起作用。 |
| android:interpolator | |
| android:max | 进度可以到达的最大值,如标题栏进度条最大值为1000。 |
| android:maxHeight | 规定进度条的最大高度的尺寸值 |
| android:maxWidth | 规定进度条的最大宽度的尺寸值 |
| android:minHeight | 规定进度条的最小高度的尺寸值 |
| android:minWidth | 规定进度条的最小宽度的尺寸值 |
| android:progress | 定义进度的初始值,[0, max] |
| android:secondaryProgress | 定义次进度的初始值,[0, max] |
| android:progressDrawable | Drawable used for the progress mode. |
(其中,标记为“*”的为我们实现自定义视图需要指定的)
接下来,让我们看一下Widget.ProgressBar.Small的样式[2]
<style name="Widget.ProgressBar.Small">
<item name="android:indeterminateDrawable">@android:drawable/progress_small_white</item>
<item name="android:minWidth">16dip</item>
<item name="android:maxWidth">16dip</item>
<item name="android:minHeight">16dip</item>
<item name="android:maxHeight">16dip</item>
</style>
其中@android:drawable/progress_small_white为显示的图像,剩下的四个Item是定义不确定进度条的显示的大小,这个我们不应该自己来定义,否则会导致不一致问题。由此, 在我们定义自己ProgressBar的样式的时候,可以将适度大小的ProgressBar作为Parentstyle。
<style name="MyProgressBar.Small" parent="@android:style/Widget.ProgressBar.Small">
<item name="android:indeterminateDrawable">@drawable/progress_small_green</item>
示例Demo
接下来,通过一些代码片段,来进一步加深对ProgressBar的理解。
标题栏进度条ProgressBar In Title Bar[3]
在标题栏中,可以在ActionBar上显示一个不确定进度条或者一个水平进度条。下面是显示两个进度条的代码片段。其中涉及进度条更新(进度、隐藏/显示),均必须在UI线程中执行。
显示不确定进度条
需要在Window中注册Intermediate Progress Bar,并且注册必须在setContentView调用之前。
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_view_layout);
动态的显示或者隐藏Intermediate ProgressBar。
setProgressBarIndeterminateVisibility(true|false);
水平进度条
必须在setContentView之前调用。
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.activity_view_layout);
设置进度的长度,0 <= progress <= 10000.
setProgress(int progress)
设置次要进度的长度,0 <= secondaryProgress <= 10000.
setSecondaryProgress(int secondaryProgress)
实时进度 Running Progress[4]
如果想要通过ProgressBar来显示一个真正的进度,必须使用水平条。在操控水平的进度条时,
如果想要在当前的进度上,增加一些进度,可以调用
public synchronized final void incrementProgressBy(int diff),或者
public synchronized void setProgress(int progress) 来改变主进度;调用
public synchronized final void incrementSecondaryProgressBy(int diff),或者
public synchronized void setSecondaryProgress(int secondaryProgress)
来改变次要进度。其中,diff 为偏移量,progress 和 secondaryProgress为具体的进度。
ProgressDialog 中显示进度条[5]
ProgressDialog是AlertDialog的一个子类,她在AlertDialog的基础上(能以弹出窗的形式显示),整合了ProgressBar的特性,拥有一个进度指示器(progress indicator),和一个可选的文本信息(text message)或者视图(view),要求文本信息和视图不能同时存在。进度范围[0,10000]。功能很强大的一个控件,有需要可以研究source code
AppWidgetProvider 中显示进度条[6]
Brain Power
当我们在实现类似Android Chrome的进度条(在ActionBar之下,当内容加载时显示) 和 Any.Do的进度条(在ActionBar之上,当更新内容时显示),我们需要用到的是自定义的ActionBar,在形如custome_action_bar_layout.xml 文件中,声明我们需要的进度条的样式。个人比较喜欢他们Android Holo 的样式,在我们的styles中可以插入如下代码
<style name="CustomeProgressBarHorizontalHoloDark" parent="@android:style/Widget.ProgressBar.Horizontal">
<item name="android:progressDrawable">@drawable/progress_horizontal_holo_dark</item>
<item name="android:max">100</item>
<item name="android:minHeight">5dip</item>
<item name="android:maxHeight">5dip</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="CustomeProgressBarHorizontalHoloLight" parent="@android:style/Widget.ProgressBar.Horizontal">
<item name="android:progressDrawable">@drawable/progress_horizontal_holo_light</item>
<item name="android:max">100</item>
<item name="android:minHeight">5dip</item>
<item name="android:maxHeight">5dip</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
其中holo_dark的drawable为:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/progress_bg_holo_dark"/>
<item android:id="@android:id/secondaryProgress">
<scale
android:drawable="@drawable/progress_horizontal_holo_dark"
android:scaleWidth="100%" />
</item>
<item android:id="@android:id/progress">
<scale
android:drawable="@drawable/progress_primary_holo_dark"
android:scaleWidth="100%" />
</item>
</layer-list>
以上用到的资源,都可以从android资源中找到
[1] 该部分内容参考自developer.android
[2] 参考自Android JellyBean’s Style
[3] 具体的代码示例参考ApidDemon ProgressBar1 & ProgrgressBar4
[4] 具体的代码示例参考ApidDemon ProgressBar1
[5] 详情参看developer.android.ProgressDialog,具体的代码示例参考ApidDemon ProgressBar3
[6] 多式样ProgressBar