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


473

我在Android应用程序中使用水平进度条,并且想要更改其进度颜色(默认情况下为黄色)。如何使用code(而不是XML)使用它?


您是否尝试过MyProgressBar.setProgressDrawable(Drawable d)指定具有所需颜色的位图?developer.android.com/reference/android/widget/... developer.android.com/reference/android/graphics/drawable/...
fupsduck

2
是的,我已经尝试过了,但是没有用。它设置整个进度条视图的背景色,而不是仅设置条本身的背景色。谢谢。
WhiteTigerK 2010年

21
android:indeterminateTint="@android:color/white"仅适用于API> = 21
Madeyedexter '17

Answers:


290

很抱歉,这不是答案,但是是什么促使从代码中设置它的要求呢?.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>

4
原因是因为我正在动态创建进度条,并根据用户要求设置其颜色。由于我通常使用代码来构建GUI屏幕和组件,因此我不熟悉所附加的XML,也不知道层列表是什么(尽管我猜您正在基于多个层来构建进度条) ..)。如果我确实想使用您随附的XML,我应该将其放置在项目文件夹中的位置,基于XML设置创建进度条还需要做更多的事情吗?谢谢。
WhiteTigerK 2010年

1
您将此xml保存为文件,并将其放置在drawable文件夹中(例如my_progress.xml),而不是在MyProgressBar.setProgressDrawable()中将其设置为drawable即可。要更改颜色,您需要在@ color /中更改这些值progress_start @ color / progress_end基本上是一个渐变,您可以在其中放置十六进制。
Alex Volovoy 2010年

3
注意-文件是SDK中的文件的副本。我在这里放弃了版权。如果您在res / drawable文件夹中查找,您将确切看到我发布的内容-颜色设置为黄色渐变,而不是自定义颜色。
Alex Volovoy 2010年

7
它对我没有显示任何颜色变化。请告诉颜色。
Praveen

嗨,亚历克斯,您的答案非常好。但是,我试图在运行时更改自定义进度轮颜色。但是,我不能。请帮我解决我的问题。经过进步reaches100%,则该时间变化的颜色,并从这个开始progress..i下载代码.. stackoverflow.com/questions/18503718/...
哈克里希纳恩

485

对于水平的ProgressBar,也可以使用ColorFilter,如下所示:

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

Red ProgressBar using color filter

注意:这会修改应用程序中所有进度条的外观。要仅修改一个特定的进度栏,请执行以下操作:

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

如果progressBar是不确定的,则使用getIndeterminateDrawable()代替getProgressDrawable()

由于棒棒糖(API 21),您可以设置进度色:

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

Red ProgressBar using progress tint


7
我想使用此答案,因为它对我来说似乎是最简单的答案,但进度条是完全红色的,与进度值无关。您确定要使用的模式吗?
LG

33
@resus我有同样的问题,该栏完全红色,看不到进度。但是我解决了将Mode.SRC_IN更改为Mode.MULTIPLY的问题。
2013年

40
getIndeterminateDrawable如果您使用不确定的进度,请不要忘记这样做。
汤米(Thommy)2014年

6
请注意,
此处的

9
如何不更改背景颜色?我只想更改进度颜色。
kangear 2015年

364

这不是以编程方式进行的,但是我认为无论如何它可以帮助很多人。
我做了很多尝试,最有效的方法是将此行添加到.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+


45
要求最低API级别21
Apfelsaft

如果必须设置动态颜色,则可以调用这些属性的设置方法。
racs 2015年

是否需要为api 21+和api <= 20创建自定义资源文件?还是在api <= 20中忽略了那些属性?
prom85 '16

1
@shriduttkothari怎么会是最好的?...从21+开始
user25

2
Android脱离4.x最低标准的最佳答案
汤姆(Tom)

228

对于不确定的进度条(微调器),我只是在可绘制对象上设置了滤色器。效果很好,只有一行。

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

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

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);

在此处输入图片说明


16
我最喜欢你的回答。为了使我的工作正常,我必须执行以下操作:myProgressBarSpinner.getIndeterminateDrawable()。setColorFilter(new LightingColorFilter(0xFF000000,前景颜色所需))
Art Geigel

4
另请注意,这样做会修改应用程序中所有进度条的可绘制对象。要仅对特定对象执行此操作,请在drawable上调用mutate(),然后在其上设置滤色器,然后在progressBar上调用setIntederminateDrawable。
dimsuz 2015年

3
注意:那些使用此功能并想知道为什么它们的颜色看起来不像它们放入的十六进制字符串的人,上面带有“多色”滤镜。更改android.graphics.PorterDuff.Mode.MULTIPLYPorterDuff.Mode.SRC_IN,您将获得准确的十六进制颜色。
micnguyen

我认为他只需要这个答案..... android:indeterminateTint =“ @ android:color / black”
穆罕默德·阿迪尔

4
我用作:progressBar =(ProgressBar)findViewById(R.id.progressBar); progressBar.getIndeterminateDrawable()。setColorFilter(ContextCompat.getColor(this,android.R.color.white),android.graphics.PorterDuff.Mode.MULTIPLY);
ashishdhiman2007

188

这是一个老问题,但是这里没有提到使用主题。如果您的默认主题使用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:theme="@style/AppTheme.WhiteAccent"

因此它将看起来像这样:

<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" />

因此,您只是colorAccent为自己的特定更改ProgressBar

注意style无法使用。您android:theme只需要使用。您可以在这里找到更多关于主题的用途:https : //plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


18
最后!谢谢,似乎没有多少开发人员使用AppCompat,很多用户只是对API 21+解决方案投了赞成票,一点也不好,他们应该支持更多的设备/操作系统
user25 2016年

1
太棒了!为我工作,但是我必须确保在样式层次结构中的某个地方有一个parent =“ @ style / Theme.AppCompat”,我有另一个父母,但起初没有起作用。
Nublodeveloper

@Nublodeveloper是的,如果您注意到的话,我在第一行中提到了这一点。
kirtan403

1
@ kirtan403嗯,是的,现在您提起我就明白了,但是当我第一次阅读它时我并没有那样的理解。我读得太快了,我在寻找代码。无论如何,谢谢您,答案对我来说是最好的!
Nublodeveloper

+1喜欢您的解决方案。但是如何在Java中设置主题的颜色呢???例如,如果我希望它是红色的<颜色名=“红色”>#ff5900 </彩色>
Maseed

54

所有API

如果使用所有API,只需以样式创建主题

style.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

并进行中

<ProgressBar
    ...
    android:theme="@style/progressBarBlue" />

API级别21及更高

如果在21级或更高级别的API中使用,请使用以下代码:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

1
很好,我认为style.xml方法是最好的。(不需要20以上的api)
iamkdblue19年

1
最佳解决方案,如果您想为所有API提供一种解决方案,谢谢:)
Naveen

34

根据一些建议,您可以指定形状和可剪贴的颜色,然后进行设置。我以编程方式进行此工作。这就是我的方法

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

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);

1
我尝试了上面的代码,不幸的是,它只会导致“空”进度条。我想念什么吗?
OceanBlue

您需要在ClipDrawable上调用setLevel。它的取值范围是0到10000。因此,progress.setLevel(2500)将占25%。
HappyEngineer 2011年

1
我已对答案进行了修改,以解释进度条为“空”的一个原因-以及两种修复方法(包括@HappyEngineer的修复程序)
Richard Le Mesurier

@RichardLeMesurier您可以在评论部分中发布解释+ 2种方式吗?progress.setLevel(2500)不适用于我,显然您的编辑由于某种原因未被接受。谢谢。+1。
ateiob 2012年


32

这为我工作:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

12
仅在API级别21及更高版本中使用
Numair '17

28

如果不确定:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

我使用了它,但是它没有动画,只应用了颜色...我使用的是圆形进度条
Manikandan 2015年

24

这对我有用。它也适用于较低版本。将此添加到您的syles.xml

<style name="ProgressBarTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/colorPrimary</item>
</style>

并在xml中像这样使用它

<ProgressBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:theme="@style/ProgressBarTheme"
   />

我已经在CryptoTweets示例应用程序中实现了此功能。我发现此解决方案按预期工作不需要父主题。parent="ThemeOverlay.AppCompat.Light"
亚当·赫维兹

23

在2016年的今天,我发现某些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);
}

对于奖励积分,它不使用任何不推荐使用的代码。尝试一下!


不要忘记调用wrapDrawable.mutate()DrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
塔西姆·辛

无法在Android KitKat 4.4.2上运行。
pradip tilala

刚刚(再次)在全新的4.4.2仿真器上尝试了此程序,它可以正常工作,没有任何问题,请检查您的.xml设置以及是否有其他东西覆盖了ProgressBar颜色。
Henrique de Sousa,

20

这就是我所做的。工作了。

进度条:

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdrawable.xml:
在这里使用渐变可以根据需要更改颜色。并且android:toDegrees =“ X”增大X的值,进度栏快速旋转。降低速度并降低旋转速度。根据需要进行自定义。

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="4000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" >

            <shape
                android:innerRadius="20dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false" >
                <size
                    android:height="48dp"
                    android:width="48dp" />

                <gradient
                    android:centerColor="#80ec7e2a"
                    android:centerY="0.5"
                    android:endColor="#ffec7e2a"
                    android:startColor="#00ec7e2a"
                    android:type="sweep"
                    android:useLevel="false" />
            </shape>

        </rotate>

样品: 在此处输入图片说明


这显示了与默认动画完全不同的(不好看的)动画。
Ixx

18

在修改默认进度栏的外观时会遇到相同的问题。这是一些更多的信息,有望对人们有所帮助:)

  • xml文件的名称只能包含以下字符:(a-z0-9_.即,不能使用大写字母!)
  • 引用您的“可绘制对象”是 R.drawable.filename
  • 要覆盖默认外观,请使用myProgressBar.setProgressDrawable(...),但是您不仅需要将自定义布局引用为R.drawable.filename,还需要将其检索为Drawable
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
  • 您需要先设置样式,然后再设置进度/次要进度/最大值(之后为我进行设置会导致进度栏为“空”)

15

这个答案中可能没有提到一件事:

如果您的主题继承自Theme.AppCompatProgressBar则将采用您"colorAccent"在主题中定义的颜色。

因此,使用..

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

..将自动将ProgressBar的颜色设置为@color/custom_color


1
我需要使用<item name =“ android:colorAccent”> @ color / highlight </ item>
tonisives 17/09/26


15

您可以尝试更改样式,主题,或在任何需要的地方使用android:indeterminateTint =“ @ color / yourColor”,但是只有一种方法可以在任何Android SKD版本上使用:

如果进度条不是不确定的,请使用:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

如果进度条不确定,请使用:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

令人遗憾的是,Android如此混乱!


谢谢!它适用于不确定性ProgressBar,但适用于确定性,可以用颜色绘制整个比例。
CoolMind

14

我如何在水平ProgressBar中做到这一点:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

2
我做了同样的事情,加上背景颜色的变化:layerDrawable.findDrawableByLayerId(android.R.id.background).setColorFilter(trackColor,PorterDuff.Mode.SRC);
Kamen Dobrev

1
这个答案以及@KamenDobrev的评论是唯一实际执行我想要的操作的人。当我仅将彩色滤光片设置为可绘制进度时,背景色也会发生变化。
m_katsifarakis

13

最简单的解决方案,如果您想更改布局xml文件中的颜色,请使用以下代码,并对所需颜色使用indeterminateTint属性。

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />

12

这个解决方案为我工作:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>

8

还有一件小事,如果您继承了基本主题,则主题解决方案可以工作,因此对于紧凑型应用,您的主题应为:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

然后在进度条主题中进行设置

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>

7

更改水平ProgressBar颜色(以kotlin为单位):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

更改不确定的ProgressBar颜色:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, android.R.id.progress)
                setId(1, android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

最后,它通常会淡化棒棒糖前的进度

api 19的进度


6

水平进度条自定义材质样式:

更改背景颜色和水平进度条的进度。

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

通过设置样式属性将其应用于进度条,有关自定义材质样式和自定义进度条,请参见http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples


3
这要求最低api级别21
Shihab Uddin '18

6

张贴以添加有关PaulieG答案的信息,因为ateiob要求我解释一些事情...


我可以说,(或者在撰写本文时,当我查看当前版本的Android源代码时,至少是这样)代码中的错误/问题/优化ProgressBar忽略了将进度设置为某个值的尝试。已经在。

  • 例如,如果progress = 45,并且您尝试将其设置为45,则代码将不执行任何操作,并且不会重绘进度

调用后ProgressBar.setProgressDrawable(),进度条将变为空白(因为您更改了可绘制部分)。

这意味着您需要设置进度并重新绘制。但是,如果仅将进度设置为保留值,则将无济于事。

您必须先将其设置为0,然后再将其设置为“旧”值,然后栏将重新绘制。


总结一下:

  • 保留“旧的”进度值
  • 更新绘图/颜色(使条变为空白)
  • 将进度重置为0(否则,下一行不执行任何操作)
  • 将进度重置为“旧”值(修复栏)
  • 使无效

下面是我执行此操作的方法:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

至于HappyEngineer的解决方案,我认为手动设置“进度”偏移量是一种类似的解决方法。无论哪种情况,上面的代码都可以为您工作。


谢谢..这确实有效..但是由于我的drawable是静态的(来自资源)..它没有用。它仅在我添加了“ drawable.invalidateSelf();”之后才起作用。前的'setProgress(0)'和'setProgressDrawable(绘制)'
AlécioCarvalho的


5

只需使用:

PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    mode = PorterDuff.Mode.MULTIPLY;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
    progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
    Drawable progressDrawable;
    progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
    progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
    progressBar.setProgressDrawable(progressDrawable);
}

4

对于水平样式的ProgressBar,我使用:

import android.widget.ProgressBar;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ClipDrawable;
import android.view.Gravity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

public void setColours(ProgressBar progressBar,
                        int bgCol1, int bgCol2, 
                        int fg1Col1, int fg1Col2, int value1,
                        int fg2Col1, int fg2Col2, int value2)
  {
    //If solid colours are required for an element, then set
    //that elements Col1 param s the same as its Col2 param
    //(eg fg1Col1 == fg1Col2).

    //fgGradDirection and/or bgGradDirection could be parameters
    //if you require other gradient directions eg LEFT_RIGHT.

    GradientDrawable.Orientation fgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;
    GradientDrawable.Orientation bgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;

    //Background
    GradientDrawable bgGradDrawable = new GradientDrawable(
            bgGradDirection, new int[]{bgCol1, bgCol2});
    bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
    bgGradDrawable.setCornerRadius(5);
    ClipDrawable bgclip = new ClipDrawable(
            bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);     
    bgclip.setLevel(10000);

    //SecondaryProgress
    GradientDrawable fg2GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg2Col1, fg2Col2});
    fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg2GradDrawable.setCornerRadius(5);
    ClipDrawable fg2clip = new ClipDrawable(
            fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Progress
    GradientDrawable fg1GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg1Col1, fg1Col2});
    fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg1GradDrawable.setCornerRadius(5);
    ClipDrawable fg1clip = new ClipDrawable(
            fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Setup LayerDrawable and assign to progressBar
    Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
    LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);     
    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    //Copy the existing ProgressDrawable bounds to the new one.
    Rect bounds = progressBar.getProgressDrawable().getBounds();
    progressBar.setProgressDrawable(progressLayerDrawable);     
    progressBar.getProgressDrawable().setBounds(bounds);

    // setProgress() ignores a change to the same value, so:
    if (value1 == 0)
        progressBar.setProgress(1);
    else
        progressBar.setProgress(0);
    progressBar.setProgress(value1);

    // setSecondaryProgress() ignores a change to the same value, so:
    if (value2 == 0)
        progressBar.setSecondaryProgress(1);
    else
        progressBar.setSecondaryProgress(0);
    progressBar.setSecondaryProgress(value2);

    //now force a redraw
    progressBar.invalidate();
  }

一个示例调用为:

  setColours(myProgressBar, 
          0xff303030,   //bgCol1  grey 
          0xff909090,   //bgCol2  lighter grey 
          0xff0000FF,   //fg1Col1 blue 
          0xffFFFFFF,   //fg1Col2 white
          50,           //value1
          0xffFF0000,   //fg2Col1 red 
          0xffFFFFFF,   //fg2Col2 white
          75);          //value2

如果不需要“二次进度”,只需将value2设置为value1。


4

将此自定义样式应用于进度栏。

<style name="customProgress" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress</item>
        <item name="android:duration">40</item>
        <item name="android:animationCache">true</item>
        <item name="android:drawingCacheQuality">low</item>
        <item name="android:persistentDrawingCache">animation</item>
    </style>

@ drawable / progress.xml-

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_white"
    android:pivotX="50%"
    android:pivotY="50%" />

使用此类型的图像显示进度条。 在此处输入图片说明

为了获得更好的结果,您可以使用多个进度图像。并且请不要犹豫使用图像,因为Android平台本身会将图像用于进度栏。该代码是从sdk中提取的:)


4

根据muhammad-adil为SDK版本21及更高版本建议

android:indeterminateTint="@color/orange"

在XML Works中对我来说很容易。


如果要更改整个应用程序,请更改<color name =“ RedAccent”>#FE6C27 </ color>的值。在您的Values / colors.xml中。
马克希尔

4

这是通过编程方式更改ProgressBar颜色的代码。

ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));

4
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);

太棒了 快速有效的解决方案。谢谢!
Tobias Reich
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.