如何更改android不确定的ProgressBar颜色?


74

我想知道如何将不确定的ProgressBar颜色从基础白色/灰色变为黑色?当更改时indeterminateDrawable,我得到的是静态图像,而不是移动的动画progressBar。有什么方法可以简单地用XML做到吗?

Answers:


81
progressBar.getIndeterminateDrawable().setColorFilter(
            getResources().getColor(Your_Color),
            android.graphics.PorterDuff.Mode.SRC_IN);

并用所需的颜色替换Your_Color,例如:R.color.your_color_code


这是最快,最简单的方法。
波城Arlandis Martinez 2015年

14
可以在xml中定义:android:indeterminateTint="@colors/your_color" android:indeterminateTintMode="src_in"
Peter Zhao

2
@zhaoyuanjie android:indeterminateTint仅适用于API级别21+
Vinay W

我很高兴我向下滚动-这应该是公认的答案。
Zsolt Safrany

搬运工的生意真的必要吗?:(
Nerdy Bunz

64

要在白色/浅色背景上使用的默认主题中获得一个ProgressBar,请使用以下一种逆样式:

<ProgressBar style="@android:style/Widget.ProgressBar.Inverse"/>
<ProgressBar style="@android:style/Widget.ProgressBar.Large.Inverse"/>
<ProgressBar style="@android:style/Widget.ProgressBar.Small.Inverse"/>

通常,这将使您在透明的ProgressBar上变黑,但是某些OS安装使用自定义资产。如果要查找特定的颜色,则必须按照CommonsWare提供的说明来滚动自己的可绘制对象。


这似乎不是与设备无关的解决方案。在我的LG Optimus 2X Speed上,不确定的ProgressBar始终始终是黑色的,而在带有CyanogenMod for 2.3.3的HTC Desire HD上,它始终是红色的。
Paul Lammertsma

@Paul-是的,您是正确的。许多设备制造商都定制主题,默认主题可以在Android版本之间进行更改。我会纠正上面的文字
ANM

34

我看到其他答案已经很老了,为了更改不确定的ProgressBar颜色,您只需在XML中直接设置android:indeterminateTintandroid:indeterminateTintMode属性ProgressBar即可:

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:indeterminateTint="@color/colorPrimary"
    android:indeterminateTintMode="src_in"
    android:indeterminate="true" />

android:indeterminateTint -色调适用于不确定进度指示器。

必须是一个颜色值,在形式"#rgb""#argb""#rrggbb""#aarrggbb",或以一个资源引用@color/colorPrimary

android:indeterminateTintMode -用于应用进度指示器色调的混合模式。

必须是以下常量之一:
addmultiplyscreensrc_atopsrc_in或者src_over

这些属性的Getter和Setter方法是:

所有这些都已在API级别21中添加


1
太令人沮丧了!在android studio中,您必须使用“查看所有属性”选项来访问indeterminateTintMode,然后将其更改为src_in ...我不会自己弄清楚这一点。谢谢!
踏板车


6
<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background" android:drawable="@drawable/bg" />
    <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/secondary" />
    <item android:id="@android:id/progress" android:drawable="@drawable/progress" />
</layer-list>

3

对于少于23种的API,请使用

progressBar.getIndeterminateDrawable().setColorFilter(
       getResources().getColor(Your_Color),
        android.graphics.PorterDuff.Mode.SRC_IN);

否则使用

progressBar.getIndeterminateDrawable().setColorFilter(
        ContextCompat.getColor(context, Your_Color),
        android.graphics.PorterDuff.Mode.SRC_IN);

1

覆盖android:colorControlActivated应该位于您的styles.xml中的AppTheme:

<style name="AppTheme" parent="...">
    ...
    <item name="android:colorControlActivated">@color/beautiful_color</item>
    ...
</style>

适用于API 21+


1
最简单的方法。谢谢!
MasterMind

-5

实际上,您需要做的所有事情(对于圆管和条形)都是在drawable中创建一个xml文件,如下所示……progress_spinner_001指向您要设置动画的图像和持续时间...您要显示多长时间框架.......并设置您的android:indeterminateDrawable = filename_in_drawable...。

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
<item android:drawable="@drawable/progress_spinner_001" android:duration="300" />
<item android:drawable="@drawable/progress_spinner_002" android:duration="300" />
<item android:drawable="@drawable/progress_spinner_003" android:duration="300" />
  <item android:drawable="@drawable/progress_spinner_004" android:duration="300" />
    <item android:drawable="@drawable/progress_spinner_005" android:duration="300" />
      <item android:drawable="@drawable/progress_spinner_006" android:duration="300" />
     <item android:drawable="@drawable/progress_spinner_007" android:duration="300" />
    <item android:drawable="@drawable/progress_spinner_008" android:duration="300" />
</animation-list>

ps你可能需要调整进度条的大小以按需要显示


4
-1:此答案显示为“如下所示”,但未显示任何内容。我觉得很难理解。
理查德·勒·梅苏里尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.