web-dev-qa-db-ja.com

Androidでプログレスバーの進行色を変更する方法

私は自分のAndroidアプリケーションで水平方向のプログレスバーを使用していて、プログレスカラー(デフォルトは黄色)を変更したいと思います。 XMLではなくcodeを使用してそれを行うことができますか。

394
WhiteTigerK

それが答えではないことを残念に思いますが、要件をコードから設定している理由は何ですか? .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>
265
Alex Volovoy

水平型のProgressBarでは、ColorFilterを使うこともできます。

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

Red ProgressBar using color filter

注: これにより、アプリ内のすべてのプログレスバーの外観が変更されます。特定のプログレスバーを1つだけ変更するには、次の操作を行います。

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

ProgressBarが不定の場合は、getIndeterminateDrawable()ではなくgetProgressDrawable()を使用してください。

Lollipop(API 21)から、あなたはプログレスティントを設定することができます。

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

Red ProgressBar using progress tint

437

これはプログラム的ではありませんが、とにかく多くの人々を助けることができると思います!私はたくさん試しましたが、最も効率的な方法は、.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+ で機能します

254
FFirmenich

私の不確定プログレスバー(スピナー)のために私はただドロウアブルにカラーフィルターを設定します。 1行だけでうまく動作します。

色を赤に設定する例:

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

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

enter image description here

216
jhavatar

これは古い質問ですが、テーマの使用はここでは言及されていません。デフォルトテーマがAppCompatを使用している場合、あなたのProgressBarの色はあなたが定義したcolorAccentになります。

colorAccentを変更すると、ProgressBarの色も変更されますが、複数の場所で変更が反映されることもあります。ですから、特定のPregressBarに対してだけ違う色が欲しい場合は、そのProgressBarにテーマを適用することでそれを実現できます。

  • デフォルトのテーマを拡張してcolorAccentをオーバーライドする

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
    
  • そしてProgressBarAndroid: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

151
kirtan403

いくつかの提案に従って、あなたは色で形とclipdrawableを指定してそれを設定することができます。私はこれをプログラム的に動かしています。これが私のやり方です。

最初にドロウアブルライブラリをインポートしてください。

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

すべての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以上

aPIレベル21以降で使用する場合は、次のコードを使用してください。

<ProgressBar
   //...
   Android:indeterminate="true"
   Android:indeterminateTintMode="src_atop"
   Android:indeterminateTint="@color/secondary"/>
31
Rasoul Miri

これは私のために働いた:

<ProgressBar
 Android:indeterminateTint="#d60909"
 ... />
27
MOH3N

不確定の場合:

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

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

ボーナスポイントのために、それは少しの非難されたコードも使いません。それを試してみてください!

21

デフォルトのプログレスバーの外観を変更しようとしているときに同じ問題にぶつかる。これは、おそらく人々に役立つと思われるいくつかの詳細な情報です:)

  • Xmlファイルの名前は文字だけを含んでいなければなりません:a-z0-9_.(すなわち、大文字ではありません!)
  • あなたの "drawable"を参照するのはR.drawable.filenameです
  • デフォルトの外観を上書きするには、myProgressBar.setProgressDrawable(...)を使用しますが、カスタムレイアウトを単にR.drawable.filenameとして参照する必要はなく、Drawableとして取得する必要があります。
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
    
  • Progress/secondary progress/max を設定する前にスタイルを設定する必要があります(後で設定すると、「空の」プログレスバーが表示されます)
18
pyko

これは私がやったことです。働いた。

ProgressBar:

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

サンプル: enter image description here

15
Debasish Ghosh

この答えで言及されていないことがおそらく1つあります。

あなたのテーマがTheme.AppCompatから継承している場合、ProgressBarはあなたがあなたのテーマで"colorAccent"として定義した色を仮定します。

だから、使用して..

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

.. ProgressBarの色を自動的に@color/custom_colorに着色します。

14
Android:progressTint="#ffffff" 
13
padeg

私は水平ProgressBarでそれをやった方法:

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

スタイル、テーマを変更したり、Androidを使用したりすることができます。indeterminateTint = "@ color/yourColor"任意の場所で使用できますが、Android SKDのすべてのバージョンで機能する方法は1つだけです。

プログレスバーが不確定ではない場合は、次のように入力してください。

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がこんなに混乱しているのは残念です。

13

この解決策は私のために働きました:

<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"/>
11
S.Javed

レイアウト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" />
11
Naveed Ahmad

もう1つ重要なことは、ベーステーマを継承した場合、テーマソリューションは機能するため、アプリをコンパクトにするためのテーマは次のとおりです。

<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
Calin

/についての情報を追加するために投稿されました PaulieGの答え 、ateiobが私に何かを説明するように依頼したので...


ProgressBarコードには、進行状況を値に設定しようとする試みを無視するバグ/問題/最適化がある(あるいは、少なくとも現時点のAndroidソースコードを見たときの執筆時点で)あったと言えます。それはすでににあります。

  • すなわち、progress = 45で、それを45に設定しようとすると、コードは何もしません。また、 は進行状況 を再描画しません。

ProgressBar.setProgressDrawable()を呼び出した後、プログレスバーは空白になります(描画可能部分を変更したため)。

これは進行状況を設定し、それを再描画する必要があることを意味します。ただし、進行状況をそのままの値に設定しただけでは何も起こりません。

あなたは最初にそれを0に設定しなければなりませんそしてそれから再び "古い"値にしなければなりません、そしてバーは再描画します。


要約すると:

  • 「古い」進捗値を保持する
  • 描画可能/色を更新する(バーを空白にする)
  • 進行状況を0にリセットします(そうでなければ次の行は何もしません)
  • 進捗を "古い"値にリセットします(fix bar)
  • 無効にする

下記は私が持っている方法です。

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の解決策に関しては、 "progress"オフセットを手動で設定することも同様の回避策だったと思います。どちらの場合でも、上記のコードはあなたのために働くはずです。

6

これはProgressBarの色をプログラムで変更するためのコードです。

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

水平スタイルの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
Keith

Android.support.v4.graphics.drawable.DrawableCompat :を使用してください。

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }
4

あなたがマルチスタイルアプリを扱っているなら、attrを使うのはとても簡単です:

この方法を試してください:

以下の属性attrs.xmlを宣言してください

 <attr name="circularProgressTheme" format="reference"></attr>

Styles.xmlのコードの下に貼り付けます

 <style name="ProgressThemeWhite" parent="ThemeOverlay.AppCompat.Light">
        <item name="colorAccent">#FF0000</item>
    </style>

    <style name="circularProgressThemeWhite">
        <item name="Android:theme">@style/ProgressThemeWhite</item>
    </style>


  <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

   <item name="circularProgressTheme">@style/circularProgressThemeWhite</item>

 </style>

下のようにプログレスバーを使う

  <ProgressBar
        style="?attr/circularProgressTheme"
        Android:id="@+id/commonProgress"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:visibility="visible"/>
3
DeepakPanwar

SDK ver 21以降で推奨されているmuhammad-adilに従って

Android:indeterminateTint="@color/orange"

xML Worksでは私にとっては十分に簡単です。

3
mughil
ProgressBar bar;

private Handler progressBarHandler = new Handler();

GradientDrawable progressGradientDrawable = new GradientDrawable(
        GradientDrawable.Orientation.LEFT_RIGHT, new int[]{
                0xff1e90ff,0xff006ab6,0xff367ba8});
ClipDrawable progressClipDrawable = new ClipDrawable(
        progressGradientDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
Drawable[] progressDrawables = {
        new ColorDrawable(0xffffffff),
        progressClipDrawable, progressClipDrawable};
LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);


int status = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO Auto-generated method stub
    setContentView(R.layout.startup);

    bar = (ProgressBar) findViewById(R.id.start_page_progressBar);
    bar.setProgress(0);
    bar.setMax(100);

    progressLayerDrawable.setId(0, Android.R.id.background);
    progressLayerDrawable.setId(1, Android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, Android.R.id.progress);

    bar.setProgressDrawable(progressLayerDrawable);
}

これは私がコードを通してプログレスバーにカスタムカラーを設定するのを助けました。それが役に立てば幸い

3
SKT

このカスタムスタイルをプログレスバーに適用します。

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

プログレスバーにこのタイプの画像を使用してください。 enter image description here

より良い結果を得るために、あなたは複数のプログレスイメージを使うことができます。 Androidプラットフォーム自体はプログレスバーに画像を使用するため、画像の使用を躊躇しないでください。コードはsdkから抽出されています:)

3
Neo

水平プログレスバーのカスタムマテリアルスタイル:

背景色と水平プログレスバーの進行状況を変更します。

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

カスタムのマテリアルスタイルとカスタムのプログレスバーのチェック用に、style属性を設定してプログレスバーに適用します http://www.zoftino.com/Android-progressbar-and-custom-progressbar-examples

2
Arnav Rao

Horizontal ProgressBarは背景にrectangle shape drawableを使用し、プログレッシブ用にrectangle shapeから構築されたClipDrawableを使用します(プライマリとセカンダリ)。着色すると色が多少変わります。 ターゲットカラーが必要な場合 3つすべてに別々に使用する場合は、次のようにProgressBar.setProgressDrawable()を使用できます。

    LayerDrawable progressBarDrawable = new LayerDrawable(
        new Drawable[]{
                new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                            new int[]{Color.parseColor("#ff0000ff"),Color.parseColor("#ff0000ff")}),

                new ClipDrawable(
                            new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                                    new int[]{Color.parseColor("#ff00ff00"),Color.parseColor("#ff00ff00")}),
                            Gravity.START,
                            ClipDrawable.HORIZONTAL),

                new ClipDrawable(
                        new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                                new int[]{Color.parseColor("#ffff0000"),Color.parseColor("#ffff0000")}),
                        Gravity.START,
                        ClipDrawable.HORIZONTAL)
            });

    progressBarDrawable.setId(0,Android.R.id.background);
    progressBarDrawable.setId(1,Android.R.id.secondaryProgress);
    progressBarDrawable.setId(2,Android.R.id.progress);
    ((ProgressBar)findViewById(R.id.progressBar)).setProgressDrawable(progressBarDrawable);

LayerDrawableを初期化している間、描画可能レイヤの順序は重要です。最初のdrawableは背景用です。私の実験によると、切り替えIDは機能しません。パディングをprogressbarに設定した場合、このアプローチは機能しません。あなたがパディングを必要とするなら、あなたはLinearLayoutのようなプログレスバーのためのコンテナを使うことができます。

2
Birendra Singh
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

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

プログレスバーの水平方向の色を変更するには(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)
            }
        }
    }
}

そしてそれはついに普通にロリポップ前のプログレスバーを色づける

tinted progress on api 19

1
John

単に使用します:

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);
}
0
Mohammad Fneish