How to change progress bar's progress color in Android

前端 未结 30 1876
情话喂你
情话喂你 2020-11-22 07:49

I\'m using an horizontal progress bar in my Android application, and I want to change its progress color (which is Yellow by default). How can I do it using code

相关标签:
30条回答
  • 2020-11-22 08:33

    Nowadays in 2016 I found some pre-Lollipop devices don't honour the colorAccent setting, so my final solution for all APIs is now the following:

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

    For bonus points, it doesn't use any deprecated code. Try it!

    0 讨论(0)
  • 2020-11-22 08:34

    All API

    if use all API just create the theme in style

    style.xml

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

    and use in progress

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

    API level 21 and higher

    if used in API level 21 and higher just use this code:

    <ProgressBar
       //...
       android:indeterminate="true"
       android:indeterminateTintMode="src_atop"
       android:indeterminateTint="@color/secondary"/>
    
    0 讨论(0)
  • 2020-11-22 08:35

    How I did it in horizontal ProgressBar:

        LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
        Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
        progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
    
    0 讨论(0)
  • 2020-11-22 08:35

    Simplest Solution if you want to change the colour in the layout xml file, use the below code and use indeterminateTint property for your desired color.

        <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" />
    
    0 讨论(0)
  • 2020-11-22 08:35

    Apply this custom style to the progress bar.

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

    Use this type of image for progress bar.

    For better result you can use multiple progress images. And please don't hesitate using images, because Android Platform itself use images for progressbar. The code is extracted from sdk :)

    0 讨论(0)
  • 2020-11-22 08:36

    This is an old question, but using theme is not mentioned here. If your default theme is using AppCompat, your ProgressBar's color will be colorAccent you have defined.

    Changing colorAccent will also change your ProgressBar's color, but there changes also reflects at multiple places. So, if you want a different color just for a specific PregressBar you can do that by applying theme to that ProgressBar :

    • Extend your default theme and override colorAccent

      <style name="AppTheme.WhiteAccent">
          <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
      </style>
      
    • And in ProgressBar add the android:theme attribute:

      android:theme="@style/AppTheme.WhiteAccent"
      

    So it will look something like this:

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

    So you are just changing a colorAccent for your particular ProgressBar.

    Note: Using style will not work. You need to use android:theme only. You can find more use of theme here: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH

    0 讨论(0)
提交回复
热议问题