介绍
从图 5.19 可以看出:ProgressBar 组件继承自 View,而 SeekBar 和 RatingBar 组件又间接继承自 ProgressBar 组件。所以对于 ProgressBar 的属性,同样适用于 SeekBar 和 RatingBar 组件。
当一个应用在后台执行时,前台界面不会有任何信息,这时用户根本不知道程序是否在执行以及执行进度等,因此需要使用进度条来提示程序执行的进度。在 Android 中,提供了两种进度条,一种是水平进度条,另一种是圆形进度条。
基本语法:
<ProgressBar
属性列表
>
</ProgressBar>
XML属性
XML属性 | 描述 |
android:max | 用于设置进度条的最大值 |
android:progress | 用于指定进度条已完成的进度值 |
android:progressDrawable | 用于设置进度条轨道的绘制形式 |
进度条组件还提供了下面两个常用方法用于操作进度:
- setProgress(int progress) 方法:用于设置进度完成的百分比
- getProgress()方法:得到当前进度条的值
- incrementProgressBy(int diff) 方法:用于设置进度条的进度增加或减少。当参数值为正数时,表示进度增加;当参数值为负数时,表示进度减少
- getVisibility()方法:得到当前视图可视状态
- setVisibility()方法:设置当前视图可视状态
ProgressBar 的 style 属性的可选值
XML属性 | 描述 |
?android:attr/progressBarStyleHorizontal | 细水平长条进度条 |
?android:attr/progressBarStyleLarge | 大圆形进度条 |
?android:attr/progressBarStyleSmall | 小圆形进度条 |
@android:style/Widget.ProgressBar.Large | 大跳跃、旋转画面的进度条 |
@android:style/Widget.ProgressBar.Small | 小跳跃、旋转画面的进度条 |
@android:style/Widget.ProgressBar.Horizontal | 粗水平长条进度条 |
例子
常规展示
编写布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp"
tools:context=".bar.ProgressBarActivity">
<!--水平进度条-->
<!--progress:设置初始值-->
<ProgressBar
android:id="@+id/horizontal_progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="50"
style="@style/Widget.AppCompat.ProgressBar.Horizontal" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginTop="5dp">
<Button
android:id="@+id/btn_dec"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="减少"
android:layout_alignParentLeft="true" />
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增加"
android:layout_alignParentRight="true" />
</RelativeLayout>
<!--圆形进度条-->
<!--设置max和progress属性无意义,不会体现在圆形进度条上-->
<ProgressBar
android:id="@+id/round_progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_round"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Round"
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal" />
</LinearLayout>
编写ProgressBarActivity
public class ProgressBarActivity extends AppCompatActivity {
private Button mBtAdd;
private Button mBtDec;
private Button mBtRound;
private ProgressBar horizontalProgressBar;
private ProgressBar roundProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar);
mBtAdd = (Button) findViewById(R.id.btn_add);
mBtDec = (Button) findViewById(R.id.btn_dec);
mBtRound= (Button) findViewById(R.id.btn_round);
horizontalProgressBar = (ProgressBar) findViewById(R.id.horizontal_progress_bar);
roundProgressBar = (ProgressBar) findViewById(R.id.round_progress_bar);
//设置点击按钮进度条加一事件
mBtAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
horizontalProgressBar.setProgress(horizontalProgressBar.getProgress()+1);
}
});
//设置点击按钮进度条减一事件
mBtDec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
horizontalProgressBar.setProgress(horizontalProgressBar.getProgress()-1);
}
});
//点击按钮,能看到进度条会在显示与隐藏之间来回切换
mBtRound.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_round:
if(roundProgressBar.getVisibility() == View.GONE) {
roundProgressBar.setVisibility(View.VISIBLE);
}else{
roundProgressBar.setVisibility(View.GONE);
}
break;
}
}
});
}
}
效果
模拟游戏进度条
编写布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 水平进度条 -->
<ProgressBar
android:id="@+id/progressBar1"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="25dp"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="60dp"
android:max="100" />
</RelativeLayout>
编写ProgressBarActivity2
public class ProgressBarActivity2 extends AppCompatActivity {
private ProgressBar horizonP; //水平进度条
private int mProgressStatus = 0; //完成进度
private Handler mHandler; //声明一个用于处理消息的Handler类的对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progress_bar2);
horizonP = (ProgressBar) findViewById(R.id.progressBar1); //获取水平进度条
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x111) {
horizonP.setProgress(mProgressStatus); //更新进度
} else {
Toast.makeText(ProgressBarActivity2.this,
"耗时操作已经完成", Toast.LENGTH_SHORT).show();
horizonP.setVisibility(View.GONE);//设置进度条不显示,并且不占用空间
}
}
};
new Thread(new Runnable() {
public void run() {
while (true) { //循环获取耗时操作完成的百分比,直到耗时操作结束
mProgressStatus = doWork(); //获取耗时操作完成的百分比
Message m = new Message(); //创建并实例化一个消息对象
if (mProgressStatus < 100) { //当完成进度不到100时,表示耗时任务未完成
m.what = 0x111; //设置代表耗时操作未完成的消息代码
mHandler.sendMessage(m); //发送信息
} else { //当完成进度到达100时,表示耗时操作完成
m.what = 0x110; //设置代表耗时操作已经完成的消息代码
mHandler.sendMessage(m); //发送消息
break; //退出循环
}
}
}
//模拟一个耗时操作
private int doWork() {
//Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值
mProgressStatus += Math.random() * 10;//改变完成进度
try {
Thread.sleep(200); //线程休眠200毫秒
} catch (InterruptedException e) {
e.printStackTrace(); //输出异常信息
}
return mProgressStatus; //返回新的进度
}
}).start(); //开启一个线程
}
}
效果