如何在Android中更改进度条的颜色?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (488)

我在Android应用程序中使用了一个水平进度条,我想更改它的颜色(默认情况下是黄色)。我要怎么通过code来更改他而不是通过配置XML?

提问于
用户回答回答于

如果定义正确的话,.setProgressDrawable能起到作用:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="5dip" />
        <gradient
                android:startColor="#ff9d9e9d"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:angle="270"
        />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#80ffd300"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>
用户回答回答于

在答案中有一点没有提到:

如果你的主题是从Theme.AppCompat继承的,则ProgressBar将假定你在主题中定义为“colorAccent”的颜色。

所以:

<item name="colorAccent">@color/custom_color</item>

.将自动将ProgressBar的颜色调到@color/custom_color

用户回答回答于

如果不确定:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
用户回答回答于

在修改默认进度栏的外观时,遇到同样的问题。 这里有一些更多的信息,希望可以帮助到大家:)

  • XML文件的名称必须仅包含字符:a-z0-9_.(也就是说,没有大写字母!)
  • 参考的你的drawable R.drawable.filename
  • 要覆盖默认外观,您可以使用myProgressBar.setProgressDrawable(...),但是您不需要将您的自定义布局引用为R.drawable.filename,则需要将其作为Drawable进行检索:Resources res = getResources();myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
  • 在设置进度/次要进度/最大值之前,需要设置样式(之后为我设置一个“空”进度栏)
用户回答回答于

现在在2016年,我发现一些pre-Lollipop设备不符合colorAccent设置,所以我现在对所有API的最终解决方案如下:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

它不是使用任何不被推荐的代码。

用户回答回答于

根据一些建议,你可以指定一个形状,并用一种颜色剪裁,然后设置它。 有有一个程序就是按照这种方法来做的。

首先,确保导入可绘制库。

import android.graphics.drawable.*;

然后使用以下代码;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);
用户回答回答于

这是一个老问题,但是在这里没有提到使用主题。 如果默认主题使用AppCompat,则ProgressBar的颜色将定义colorAccent

更改colorAccent也会改变ProgressBar的颜色,但是这些变化也反映在多个地方。 所以,如果您想为特定的PregressBar创建不同的颜色,您可以通过将主题应用于ProgressBar来实现:

  • 扩展默认主题并重写colorAccent<style name="AppTheme.WhiteAccent"> <item name="colorAccent">@color/white</item> <!-- Whatever color you want--> </style>
  • ProgressBar添加android:theme属性:

Android:主题=@Style/AppTheme。WhiteAcent

所以它看起来会是这样的:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

所以你只是改变你的特定ProgressBarcolorAccent

*使用style都没用。你需要用android:theme只有。在以下可以找到更多的theme用法:https://plus.google.com/u/0/+AndroidDevelopers/POST/JXHKyhsWHAH

用户回答回答于

我尝试过最有效的方法是在XML文件中将这一行添加到我的ProgressBar中:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

以下这段代码是我写的:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

此解决方案适用于api 21+。

用户回答回答于

对于我不确定的进度条(微调),我只是在drawable设置了一个颜色过滤器。效果很好,只有一行。

将颜色设置为红色的示例:

ProgressBar spinner = new android.widget.ProgressBar(
                context,
                null,
                android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);
用户回答回答于

对于水平ProgressBar,可以通过使用ColorFilter

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

注:这将修改应用程序中所有进度条的外观。如果只修改一个特定的进度条,请执行以下操作:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

如果进度条不确定,请使用getIndeterminateDrawable()而不是getProgressDrawable()

由Lolliop(API 21),可以设置进度条色调:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

扫码关注云+社区

领取腾讯云代金券