如何完整修改ProgressBar?咨询内部进度条样式调整方法
搞定ProgressBar内部进度条的样式修改问题
不用急着去做自定义组件!大多数情况下,你完全可以通过样式属性或者自定义Drawable来直接调整内部红色进度指示条的样式,下面分两种常见场景给你具体方案:
1. 原生Android水平ProgressBar
如果用的是原生的水平样式ProgressBar,有两种简单的修改方式:
快速改色:用XML属性直接设置
API 21及以上的系统,可以直接用android:progressTint属性修改进度条颜色,搭配android:backgroundTint改外部背景:
<ProgressBar android:id="@+id/horizontal_progress" android:layout_width="match_parent" android:layout_height="24dp" android:progress="65" android:progressTint="#FF6200EE" <!-- 内部进度条颜色 --> android:backgroundTint="#E5E5E5" <!-- 外部背景颜色 --> style="@android:style/Widget.ProgressBar.Horizontal" />
灵活定制:自定义Drawable文件
如果需要圆角、渐变这类更复杂的样式,就创建一个layer-list drawable:
在res/drawable/custom_progress_bar.xml中写入:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 进度条背景层 --> <item android:id="@android:id/background"> <shape> <solid android:color="#E5E5E5" /> <corners android:radius="12dp" /> <!-- 背景圆角 --> </shape> </item> <!-- 内部进度指示层 --> <item android:id="@android:id/progress"> <clip> <shape> <gradient android:startColor="#FF6200EE" android:endColor="#FF3700B3" android:angle="0" /> <!-- 渐变进度条 --> <corners android:radius="12dp" /> <!-- 进度条圆角 --> </shape> </clip> </item> </layer-list>
然后在布局里引用这个drawable:
<ProgressBar android:id="@+id/custom_progress" android:layout_width="match_parent" android:layout_height="24dp" android:progress="65" android:progressDrawable="@drawable/custom_progress_bar" style="@android:style/Widget.ProgressBar.Horizontal" />
2. Material Design组件的ProgressIndicator
如果你用的是Material库的LinearProgressIndicator(现在更推荐用这个替代旧ProgressBar),直接用组件属性就能搞定:
<com.google.android.material.progressindicator.LinearProgressIndicator android:id="@+id/material_progress" android:layout_width="match_parent" android:layout_height="18dp" android:progress="70" app:trackColor="#E5E5E5" <!-- 外部背景 --> app:indicatorColor="#FF6200EE" <!-- 内部进度条 --> app:trackCornerRadius="9dp" app:indicatorCornerRadius="9dp" />
什么时候需要自定义组件?
只有当你需要特别特殊的效果——比如动态变化的渐变、自定义的动画路径,或者和业务绑定的特殊交互——而上面的方法都满足不了时,再考虑继承ProgressBar或者View来写自定义组件。
内容的提问来源于stack exchange,提问作者Daniel Kaplan




