Android 之 控件 - ProgressBar 进度条

 ​​一、基础使用​

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();

 ​​五、性能优化与避坑​

  1. ​避免主线程阻塞​

    耗时操作(如网络请求)必须在子线程执行,仅在主线程更新 UI。

  2. ​及时释放资源​

    @Override
    protected void onDestroy() {
        super.onDestroy();
        progressBar.setVisibility(View.GONE); // 避免内存泄漏
    }
  3. ​按需启用动画​

    不确定进度条在后台运行时消耗资源,任务完成后立即隐藏:

    indeterminateBar.setIndeterminate(false);
    indeterminateBar.setVisibility(View.GONE);

 ​​六、类型对比与选型​

​类型​

​特点​

​适用场景​

​水平进度条​

显示具体进度值

文件下载、安装进度

​环形不确定进度​

循环动画,无具体数值

网络请求、数据初始化

​步进模式​

分阶段更新进度

多步骤表单提交

​最佳实践​​:

  • 简单任务 → AsyncTask或 Handler

  • 复杂异步 → RxJava或 Kotlin 协程

  • 自定义样式 → 使用 layer-list替代代码绘制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值