Android如何通过代码自定义水平ProgressBar的progressDrawable修改进度和背景色
Android 代码动态修改水平ProgressBar进度与背景颜色方案
问题原因
你之前的实现仅传入了单一的背景Drawable作为progressDrawable,而水平ProgressBar的progressDrawable要求是包含固定id层级的LayerDrawable,必须包含两个核心子项:
- id为
android.R.id.background的背景层 - id为
android.R.id.progress的进度裁剪层
缺少进度层的情况下系统无法渲染进度内容,因此仅显示背景。
正确实现代码(Kotlin)
// 1. 创建背景Drawable val backgroundDrawable = GradientDrawable().apply { shape = GradientDrawable.RECTANGLE setColor(backgroundColor) // 传入你需要的背景色 } // 2. 创建进度Drawable val progressDrawable = GradientDrawable().apply { shape = GradientDrawable.RECTANGLE setColor(progressColor) // 传入你需要的进度色 } // 3. 给进度Drawable套裁剪层,对应xml中的<clip>标签,从左到右裁剪 val clipProgressDrawable = ClipDrawable( progressDrawable, Gravity.START, ClipDrawable.HORIZONTAL ) // 4. 构造LayerDrawable,对应xml中的layer-list val layerDrawable = LayerDrawable( arrayOf(backgroundDrawable, clipProgressDrawable) ).apply { // 给两个层设置系统约定的id,必须和xml里的id一致 setId(0, android.R.id.background) setId(1, android.R.id.progress) } // 5. 赋值给ProgressBar pbStatValue.progressDrawable = layerDrawable // 注意:需要给ProgressBar设置进度才会显示进度部分,比如设置50%进度 pbStatValue.progress = 50
后续动态修改颜色的简化方案
如果后续需要频繁修改颜色,不需要每次重建整个LayerDrawable,可以直接操作现有Drawable:
// 强转现有progressDrawable为LayerDrawable val layer = pbStatValue.progressDrawable as LayerDrawable // 修改背景色 (layer.findDrawableByLayerId(android.R.id.background) as GradientDrawable) .setColor(newBackgroundColor) // 修改进度色 val clipDrawable = layer.findDrawableByLayerId(android.R.id.progress) as ClipDrawable (clipDrawable.drawable as GradientDrawable).setColor(newProgressColor)
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

