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

21
android:indeterminateTint="@android:color/white"21以上のAPIでのみ動作します
Madeyedexter 2017

回答:


291

それが答えではなくて申し訳ありませんが、コードからそれを設定する要件を動かしているのは何ですか?そして、.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をファイルとして保存し、MyProgressBar.setProgressDrawable()でドローアブルとして設定するよりも、ドローアブルフォルダー(my_progress.xmlなど)に配置します。色を変更するには、@ color /でこれらの値を変更する必要があります。 progress_start @ color / progress_endこれは基本的にグラデーションであり、そこに16進数を配置できます。
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);

カラーフィルターを使用した赤のProgressBar

注:これにより、アプリのすべての進行状況バーの外観が変更されます。特定の進行状況バーを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));

進捗ティントを使用した赤いProgressBar


7
この答えを使用したかったのは、私にとっては最も単純な答えのように思われたが、進行状況バーは進行状況の値とは関係なく完全に赤である。使用するモードを確認しますか?
LG

33
@resus同じ問題があります。バーは完全に赤で、進行状況は表示されませんでした。しかし、Mode.SRC_INをMode.MULTIPLYに変更することで解決しました。
Derzu 2013

40
getIndeterminateDrawable不確定な進行状況を使用している場合は、同じことを行うことを忘れないでください。
Thommy、2014

6
このコンテキストでの「モード」は、android.graphics.PorterDuff.Mode
1owk3y

9
背景色を変更しない方法は?進行色を変えたいだけです。
カンギア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

これらのプロパティには、動的な色を設定する必要がある場合に呼び出すことができるセッターメソッドもあります。
2015

api 21+およびapi <= 20のカスタムリソースファイルを作成する必要がありますか?または、これらの属性はapi <= 20では無視されますか?
prom85

1
@shriduttkothariどうすれば最高になれますか?... 21歳以上
user25

2
離れ4.xの最小値からAndroidのシフトとして最高の答え
トム・

229

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

色を赤に設定する例:

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、foregroundColorDesired));
Art Geigel 2013

4
また、これを行うと、アプリ内のすべてのプログレスバーのドローアブルが変更されることにも注意してください。これを特定の1つだけに行うには、drawableでmutate()を呼び出し、それにカラーフィルターを設定してから、progressBarでsetIntederminateDrawableを呼び出します。
dimsuz 2015

3
注意:これを使用していて、なぜ自分の色が入力した16進数の文字列とまったく同じに見えないのか疑問に思っている人は、Multiple Colorフィルターを使用しています。に変更android.graphics.PorterDuff.Mode.MULTIPLYするPorterDuff.Mode.SRC_INと、正確な16進数の色が表示されます。
micnguyen

私は彼がこの答えを必要とするだけだと思います..... android:indeterminateTint = "@ android:color / black"
Muhammad Adil

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+のソリューションで回答を投票するだけで、まったくうまくいきません。可能な限り多くのデバイス/ OSをサポートする必要があります
user25

1
驚くばかり!私にとってはうまくいきましたが、私は別の親がいるスタイル階層のどこかにparent = "@ style / Theme.AppCompat"があることを確認する必要があり、最初は機能しませんでした。
Nublodeveloper 2017年

@Nublodeveloperはい気づいたら、最初の行でそれを述べました。
kirtan403 2017年

1
@ kirtan403ああ、そうです、あなたが言ったようになりましたが、最初に読んだときはそのように理解していませんでした。速すぎてコードを探していました。とにかくありがとう、あなたの答えは私にとって最高です!
Nublodeveloper 2017年

+1あなたのソリューションが気に入りました。しかし、Javaでテーマの色を設定する方法は??? たとえば、赤い色にしたい場合<color name = "red">#ff5900 </ color>
18年

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

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

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

1
ニース、style.xmlメソッドが最善だと思います。(20 APIを超える必要はありません)
iamkdblue

1
すべてのAPIに対して1つのソリューションが必要な場合の最適なソリューションありがとうございます:)
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 2009

1
「空の」進行状況バーの1つの理由と、それを修正する2つの方法(@HappyEngineerの修正を含む)を説明する回答の編集を送信しました
Richard Le Mesurier

@RichardLeMesurierは、コメントセクションに説明と2つの方法を投稿できますか?progress.setLevel(2500)私にはうまくいきません、どういうわけかあなたの編集は受け入れられませんでした。ありがとう。+1。
ateiob


32

これは私のために働きました:

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

12
APIレベル21以降でのみ使用
Numair 2017

28

不確定の場合:

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

私はこれを使用しましたが、アニメーションではなく、色が適用されました...私は円形のプログレス
バー

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"
Adam Hurwitz

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

Android KitKat 4.4.2では動作しません。
プラディップティララ

新しい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 2018年

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

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

あなたのテーマが継承されている場合はTheme.AppCompatProgressBarあなたのように定義された色と仮定します"colorAccent"、あなたのテーマでは。

だから、使って..

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

..ProgressBarの色を自動的に@color/custom_color


1
私は<項目名= "アンドロイド:colorAccent">を使用するために必要な色/ハイライト@ </アイテム>
tonisives


15

スタイル、テーマを変更したり、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がこのように混乱しているのは悲しいことです。


ありがとう!不確定ProgressBarに対しては機能しますが、確定に対しては全体のスケールを色でペイントします。
CoolMind 2018

14

水平プログレスバーでどのようにしたか:

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

2
同じことを行って、背景色を変更しました。
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

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

(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、2018年

6

PaulieGの回答に関する情報を追加するために投稿しました。ateiobが私に説明を求めてきたためです...


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

  • つまり、progress = 45で、45に設定しようとすると、コードは何もせず、progressを再描画しません

を呼び出した後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.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 ver 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);

驚くばかり。迅速かつ効果的なソリューション。ありがとう!
トビアスライヒ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.