首页 > 解决方案 > 以编程方式创建自定义 ProgressBar 可绘制对象

问题描述

我需要以编程方式更改水平进度条的颜色。我需要设置进度条color和背景backgroundColor 所以我需要为我的进度条设置一个新的progressDrawable或更改现有的。

进度条xml:

    <ProgressBar
        android:id="@+id/pb_stat_value"
        style="@style/CustomProgressBar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginEnd="@dimen/margin_prog_bar_medium"
        android:layout_weight="5" />

CustomProgressBar风格:

<style name="CustomProgressBar" parent="android:Widget.ProgressBar.Horizontal">
    <item name="android:indeterminateOnly">false</item>
    <item name="android:progressDrawable">@drawable/custom_progress_bar_horizontal</item>
    <item name="android:minHeight">@dimen/height_progress_bar_medium</item>
    <item name="android:maxHeight">@dimen/height_progress_bar_large</item>
</style>

custom_pogress_bar_horizzontal.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="@color/white" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <solid android:color="@color/black" />
            </shape>
        </clip>
    </item>
</layer-list>

我正在尝试使用此代码,但我只得到背景:

            val shape = GradientDrawable()
            shape.shape = GradientDrawable.RECTANGLE
            shape.setColor(backgroundColor)

            pbStatValue.progressDrawable = shape

标签: androidxmlandroid-drawableandroid-progressbar

解决方案


我使用 Drawable 扩展来转述这一点:

的翻译<item android:id="@android:id/background">

val item1 = GradientDrawable()
item1.shape = GradientDrawable.RECTANGLE
item1.setColor(Utils.lighten(backgroundColor, 0.13))

的翻译<item android:id="@android:id/progress">

val shape = GradientDrawable()
shape.setColor(color)
val item2 = ClipDrawable(shape, Gravity.START, ClipDrawable.HORIZONTAL)

合并Drawables:

val array = arrayOf(item1, item2)
val listDrawable = LayerDrawable(array)

将其分配给可绘制的进度条

pbStatValue.progressDrawable = listDrawable

推荐阅读