一、基础使用
1. XML 布局声明
<!-- 水平进度条(确定模式) -->
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="30" /> <!-- 初始进度30% -->
<!-- 环形进度条(不确定模式) -->
<ProgressBar
android:id="@+id/indeterminateProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true" /> <!-- 启用不确定动画 -->
2. Java 代码控制
ProgressBar progressBar = findViewById(R.id.progressBar);
ProgressBar indeterminateBar = findViewById(R.id.indeterminateProgressBar);
// 设置进度(确定模式)
progressBar.setProgress(50);
// 显示/隐藏进度条
progressBar.setVisibility(View.VISIBLE); // 显示
progressBar.setVisibility(View.GONE); // 隐藏(不占布局空间)
// 控制不确定动画
indeterminateBar.setIndeterminate(true); // 启动动画
二、事件监听
1. 进度变化监听
progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// 进度被用户拖动或代码修改时触发
if (progress >= 100) {
Toast.makeText(MainActivity.this, "任务完成!", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// 用户开始拖动进度条
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// 用户停止拖动进度条
}
});
注意:
SeekBar是ProgressBar的子类,支持用户交互拖动。
三、样式定制
1. 自定义进度条外观
步骤1:创建 Drawable 资源文件
res/drawable/custom_progress.xml:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 背景层 -->
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<solid android:color="#E0E0E0" />
<corners android:radius="5dp" />
</shape>
</item>
<!-- 进度层 -->
<item android:id="@android:id/progress">
<clip>
<shape android:shape="rectangle">
<solid android:color="#FF4081" /> <!-- 进度颜色 -->
<corners android:radius="5dp" />
</shape>
</clip>
</item>
</layer-list>
步骤2:应用自定义样式
<ProgressBar
android:progressDrawable="@drawable/custom_progress"
... />
2. 修改颜色与动画
// 动态设置进度条颜色(API 21+)
progressBar.setProgressTintList(ColorStateList.valueOf(Color.BLUE));
progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.LTGRAY));
四、结合异步任务更新进度
1. 使用 AsyncTask(已废弃,但兼容旧版)
private class DownloadTask extends AsyncTask<Void, Integer, Void> {
@Override
protected Void doInBackground(Void... voids) {
for (int i = 0; i <= 100; i++) {
publishProgress(i); // 触发onProgressUpdate
SystemClock.sleep(50); // 模拟耗时
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]); // 主线程更新UI
}
}
// 启动任务
new DownloadTask().execute();
DownloadTask().execute();
2. 推荐:Handler + 线程
new Thread(() -> {
for (int i = 0; i <= 100; i++) {
int progress = i;
new Handler(Looper.getMainLooper()).post(() -> {
progressBar.setProgress(progress); // 主线程更新
});
SystemClock.sleep(50);
}
}).start();
五、性能优化与避坑
-
避免主线程阻塞
耗时操作(如网络请求)必须在子线程执行,仅在主线程更新 UI。
-
及时释放资源
@Override protected void onDestroy() { super.onDestroy(); progressBar.setVisibility(View.GONE); // 避免内存泄漏 } -
按需启用动画
不确定进度条在后台运行时消耗资源,任务完成后立即隐藏:
indeterminateBar.setIndeterminate(false); indeterminateBar.setVisibility(View.GONE);
六、类型对比与选型
|
类型 |
特点 |
适用场景 |
|---|---|---|
|
水平进度条 |
显示具体进度值 |
文件下载、安装进度 |
|
环形不确定进度 |
循环动画,无具体数值 |
网络请求、数据初始化 |
|
步进模式 |
分阶段更新进度 |
多步骤表单提交 |
最佳实践:
简单任务 →
AsyncTask或Handler复杂异步 →
RxJava或Kotlin 协程自定义样式 → 使用
layer-list替代代码绘制
186

被折叠的 条评论
为什么被折叠?



