一、前言
其实
ProgressBar
和
ProgressDialog
,自己实现的话,可能反而要简单些。但是google为满足多种需求,反而把他们搞复杂,。更糟糕的是,google并没有能很好的实现这些需求。我在对他们的学习也花了不少时间,个人觉得这是不值得的。
二、ProgressBar简介
android.widget.ProgressBar用于表示一些操作正在进行,以便用户耐心的等待。
ProgressBar
通常用以一个长方形的主进度条显示操作的进度,如
图1
。但是它可以在主进度条的基础上再显示一个长方形的次进度条。比如我们在线播放视频的时候,就可以用主进度条来指示当前播放的进度,用次进度条来显示缓存的进度,如
图2
。要显示
长方形的主进度的话,
p
rogressBar的styles就必须为
Widget.ProgressBar.Horizontal
对于
styles为
Widget.ProgressBar.Horizontal的
progressBar,
可把它的
android:indeterminate
设置为
true
。
这时只能有主进度条,虽然进度条还是长方形,但是它只是循环的播放动画,它只是表示操作在进行,而无法表示进度进展到什么程度,如
图3
.
虽然google文档说
The indeterminate progress bar can be either a spinning wheel or a horizontal bar
.
但是如果
progressBar
的
styles
不为
Widget.ProgressBar.Horizontal
的话,它就不是长方形Bar,它也只能为
indeterminate
形式,即也只能表示操作在进行,而无法表示进度进展到什么程度,如
图4
。
图3
indeterminate 模式
以下是一个如何在工作线程中通知
UI
线程更新
ProgressBar
显示进度的示例
public class MyActivity extends Activity {
private static final int PROGRESS = 0x1;
private ProgressBar mProgress;
private int mProgressStatus = 0;
private Handler mHandler = new Handler();
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.progressbar_activity);
mProgress = (ProgressBar) findViewById(R.id.progress_bar);
// Start lengthy operation in a background thread
new Thread(new Runnable() {
public void run() {
while (mProgressStatus < 100) {
mProgressStatus = doWork();
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
}
});
}
}
}).start();
}
}
<ProgressBar>
。默认的
ProgressBar
显示的是
spinning wheel
,如
图4
.为了显示长方形的进度条,你需要把progressBar的styles设置
Widget.ProgressBar.Horizontal
,示例如下
<ProgressBar
style="@android:style/Widget.ProgressBar.Horizontal"
... />
如果你想显示具体的进度,你必须使用
Widget.ProgressBar.Horizontal
风格,你可以使用
ProgressBar
的
incrementProgressBy()
或setProgress()
来更新进度的显示。
ProgressBar
默认的进度的最大是100,你可以通过
<LinearLayout
android:orientation="horizontal"
... >
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Small"
android:layout_marginRight="5dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loading" />
</LinearLayout>
另外,系统还提供了其他的以下风格。
现在定义了的所有风格如下:
The "
inverse
" styles provide an inverse color scheme for the spinner, which may be necessary if your application uses a light colored theme (a white background).