Android - Tinting ProgressBar on pre-Lollipop devices

后端 未结 6 612
梦谈多话
梦谈多话 2020-12-31 05:27

My app\'s minimum API-level is 19 (KitKat), and contains a layout with a horizontal ProgressBar. I\'m using android:progressTint attribute to tint

相关标签:
6条回答
  • 2020-12-31 05:29

    If you want to do it programmatically, try this

    public static void setSeekbarTint(SeekBar seekbar, int color) {
            PorterDuff.Mode porterDuffMode = PorterDuff.Mode.SRC_IN;
            if (seekbar.getIndeterminateDrawable() != null)
                seekbar.getIndeterminateDrawable().setColorFilter(color, porterDuffMode);
    
            if (seekbar.getProgressDrawable() != null &&
                    seekbar.getProgressDrawable() instanceof LayerDrawable) {
                LayerDrawable layerDrawable = (LayerDrawable) seekbar.getProgressDrawable();
                GradientDrawable gradientDrawable = (GradientDrawable) layerDrawable.findDrawableByLayerId(android.R.id.background);
    
                layerDrawable.setColorFilter(color, porterDuffMode);
                seekbar.setProgressDrawable(layerDrawable);
                gradientDrawable.setColorFilter(Color.WHITE, porterDuffMode);
            } else if (seekbar.getProgressDrawable() != null &&
                    seekbar.getProgressDrawable() instanceof ClipDrawable) {
                ClipDrawable clipDrawable = (ClipDrawable) seekbar.getProgressDrawable();
                clipDrawable.setColorFilter(color, porterDuffMode);
                seekbar.setProgressDrawable(clipDrawable);
            }
    }
    
    0 讨论(0)
  • 2020-12-31 05:40

    I hope this will help you. Try this:

    <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminate="true"
            android:indeterminateTint="#F00"
            android:indeterminateTintMode="src_in" />
    
    0 讨论(0)
  • 2020-12-31 05:44
    progress.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    
    0 讨论(0)
  • 2020-12-31 05:45

    This works for me

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

    Then in your style.xml define progressBarBlue

    <style name="progressBarWhite" parent="@style/Theme.AppCompat">
       <item name="colorAccent">@color/blue</item>
    </style>
    
    0 讨论(0)
  • 2020-12-31 05:48

    You can wrap with ProgressBar indeterminateDrawable method for pre-Lollipop.

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    
         Drawable drawableProgress = DrawableCompat.wrap(progressBar.getIndeterminateDrawable());
         DrawableCompat.setTint(drawableProgress, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
         progressBar.setIndeterminateDrawable(DrawableCompat.unwrap(drawableProgress));
    
    } else {
        progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
    }
    
    0 讨论(0)
  • 2020-12-31 05:53

    Thanks for the suggestions from everyone! :)

    The solution which works for me is to create a custom drawable XML file with the <layer-list> root element. There, I'm defining two layer items with the native Android IDs @android:id/background and @android:id/progress. After this, I can define the shapes and color resources I would like to use. This solution is similar to a more popular answer on this SO question.


    Content of my res/drawable/progressbar.xml file:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:id="@android:id/background">
    
            <shape>
    
                <corners android:radius="2dip" /> <!--optional-->
    
                <gradient
                    android:angle="270"
                    android:endColor="@color/gray"
                    android:startColor="@color/gray" />
    
            </shape>
    
        </item>
    
        <item android:id="@android:id/progress">
    
            <clip>
    
                <shape>
    
                    <corners android:radius="2dip" /> <!--optional-->
    
                    <gradient
                        android:angle="270"
                        android:endColor="@color/blue"
                        android:startColor="@color/blue" />
    
                </shape>
    
            </clip>
    
        </item>
    
    </layer-list>
    

    Defined as progressDrawable for my ProgressBar in the layout XML file:

    <ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="0dp"
            android:layout_height="@dimen/progress_bar_height"
            android:progressDrawable="@drawable/progressbar" />
    

    I didn't have a chance to test it below API 19, but on this level and above it works perfectly.

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