web-dev-qa-db-ja.com

Android水平プログレスバーの色を変更

水平プログレスバーを設定しました。

黄色の進行色を変更したいです。

<ProgressBar 
    Android:id="@+id/progressbar" 
    Android:layout_width="80dip" 
    Android:layout_height="20dip"  
    Android:focusable="false" 
    style="?android:attr/progressBarStyleHorizontal" />

問題は、デバイスごとに進行状況の色が異なることです。だから、進行状況の色を修正してほしい。

155
Nishant Shah

私は自分のアプリの1つからこれをコピーしたので、いくつかの余分な属性がありますが、アイデアが得られるはずです。これは、プログレスバーがあるレイアウトからのものです。

<ProgressBar
    Android:id="@+id/ProgressBar"
    style="?android:attr/progressBarStyleHorizontal"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:indeterminate="false"
    Android:maxHeight="10dip"
    Android:minHeight="10dip"
    Android:progress="50"
    Android:progressDrawable="@drawable/greenprogress" />

次に、次のようなもの(この場合はgreenprogress.xml)で新しいドロアブルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<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="#33FF33"
                Android:endColor="#008000"
                Android:angle="270" />
        </shape>
    </clip>
</item>

</layer-list>

必要に応じて色を変更できます。これにより、緑色の進行状況バーが表示されます。

343
Ryan

より簡単なソリューション:

progess_drawable_blue

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:id="@Android:id/background">
    <shape>
        <solid
                Android:color="@color/disabled" />
    </shape>
</item>

<item
    Android:id="@Android:id/progress">
    <clip>
        <shape>
            <solid
                Android:color="@color/blue" />
        </shape>
    </clip>
</item>

</layer-list>
96
Nitin Saxena

進行状況バーの色のみを変更したい場合は、アクティビティのonCreate()メソッドでカラーフィルターを使用するだけです。

ProgressBar progressbar = (ProgressBar) findViewById(R.id.progressbar);
int color = 0xFF00FF00;
progressbar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
progressbar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);

here からのアイデア。

これは、Lollipopより前のバージョンでのみ必要です。 Lollipopでは、colorAccentスタイル属性を使用できます。

35
amfcosta

values/styles.xmlでスタイルを作成するだけです。

<style name="ProgressBarStyle">
    <item name="colorAccent">@color/greenLight</item>
</style>

次に、このスタイルをProgressBarテーマとして設定します。

<ProgressBar
    Android:theme="@style/ProgressBarStyle"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"/>

進行状況バーが水平でも円形でもかまいません。それで全部です。

33
Ali Zeynali

aPIレベル21以上の場合は、

Android:progressBackgroundTint="@color/yourBackgroundColor"
Android:progressTint="@color/yourColor"
15

この問題を解決するには3つの方法があります。

  1. プログレスバーの色を宣言的に調整する方法
  2. プログレスバーの色をプログラムで調整する方法。ただし、コンパイル前に宣言されたさまざまな事前定義色から色を選択
  3. プログレスバーの色をプログラムで調整し、プログラムで色を作成する方法。

特に、amfcostaの答えへのコメントに見られるように、#2と#3については多くの混乱があります。その答えは、背景色のみを変更するため、プログレスバーを原色以外に設定したいときはいつでも予測できない色の結果をもたらし、実際のプログレスバーの「クリップ」領域は不透明度の低い黄色のオーバーレイのままです。たとえば、そのメソッドを使用して背景をダークパープルに設定すると、プログレッシブバーの「クリップ」カラーは、減少したアルファを介したダークパープルとイエローの混合に起因するクレイジーなピンク色になります。

とにかく、#1にはRyanが完全に答え、シュタルケは#3のほとんどに答えますが、#2と#3の完全な解決策を探している人には:


プログレスバーの色をプログラムで調整する方法、ただしXMLで宣言された事前定義の色から色を選択する方法

res/drawable/my_progressbar.xml

このファイルを作成しますが、my_progressおよびmy_secondsProgressの色を変更します。

(注:これは、デフォルトのAndroid SDK ProgressBarを定義する実際のXMLファイルの単なるコピーですが、IDと色を変更しました。元の名前はprogress_horizo​​ntalです)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item Android:id="@+id/my_progress_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="@+id/my_secondaryProgress">
    <clip>
        <shape>
            <corners Android:radius="5dip" />
            <gradient
                Android:startColor="#80ff171d"
                Android:centerColor="#80ff1315"
                Android:centerY="0.75"
                Android:endColor="#a0ff0208"
                Android:angle="270"
                />
        </shape>
    </clip>
</item>

<item Android:id="@+id/my_progress">
    <clip>
        <shape>
            <corners Android:radius="5dip" />
            <gradient
                Android:startColor="#7d2afdff"
                Android:centerColor="#ff2afdff"
                Android:centerY="0.75"
                Android:endColor="#ff22b9ba"
                Android:angle="270"
                />
        </shape>
    </clip>
</item>

Javaで

final Drawable drawable;
int sdk = Android.os.Build.VERSION.SDK_INT;
    if(sdk < 16) {
        drawable =  ctx.getResources().getDrawable(R.drawable.my_progressbar);
    } else {
        drawable = ContextCompat.getDrawable(ctx, R.drawable.my_progressbar);
    }
progressBar.setProgressDrawable(drawable)

プログレスバーの色をプログラムで調整し、プログラムで色を作成する方法

編集:これを適切に解決する時間を見つけました。私の以前の答えは、これを少しあいまいにした。

ProgressBarは、LayerDrawableの3つのDrawableとして構成されます。

  1. レイヤー1は背景です
  2. レイヤー2は、2次進行色です
  3. レイヤー3は主な進行状況バーの色です

以下の例では、メインプログレスバーの色をシアンに変更します。

//Create new ClipDrawable to replace the old one
float pxCornerRadius = viewUtils.convertDpToPixel(5);
final float[] roundedCorners = new float[] { pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius };
ShapeDrawable shpDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));
shpDrawable.getPaint().setColor(Color.CYAN);
final ClipDrawable newProgressClip = new ClipDrawable(shpDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);

//Replace the existing ClipDrawable with this new one
final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
layers.setDrawableByLayerId(R.id.my_progress, newProgressClip);

この例では、単色に設定しています。グラデーション色に設定することができます

shpDrawable.getPaint().setColor(Color.CYAN);

Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);

乾杯。

-ランス

5
lance.dolan

プログラムでそれを行う方法を探している人向け:

    Drawable bckgrndDr = new ColorDrawable(Color.RED);
    Drawable secProgressDr = new ColorDrawable(Color.GRAY);
    Drawable progressDr = new ScaleDrawable(new ColorDrawable(Color.BLUE), Gravity.LEFT, 1, -1);
    LayerDrawable resultDr = new LayerDrawable(new Drawable[] { bckgrndDr, secProgressDr, progressDr });
    //setting ids is important
    resultDr.setId(0, Android.R.id.background);
    resultDr.setId(1, Android.R.id.secondaryProgress);
    resultDr.setId(2, Android.R.id.progress);

IDをドロウアブルに設定することは非常に重要であり、境界とプログレスバーの実際の状態を保持します。

2
Štarke

私が見つけた最も簡単な解決策は次のようなものです:

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

上記をstyles.xmlフォルダーの下のres > valuesファイルに入れます。

注:他のアクセントカラーを使用する場合は、以前のソリューションで問題ないはずです。

API 21以降

2
Sazid

あなたたちは本当に私に頭痛を与えています。できることは最初にxmlでレイヤーリストを描画可能にする(最初のレイヤーとして背景を、2番目のレイヤーとして二次的な進捗を表すドロウアブル、そして一次的な進捗を表す別のドローアブルを意味する)最後のレイヤー)、次を実行してコードの色を変更します:

public void setPrimaryProgressColor(int colorInstance) {
      if (progressBar.getProgressDrawable() instanceof LayerDrawable) {
        Log.d(mLogTag, "Drawable is a layer drawable");
        LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable();
        Drawable circleDrawableExample = layered.getDrawable(<whichever is your index of Android.R.id.progress>);
        circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN);
        progressBar.setProgressDrawable(layered);
    } else {
        Log.d(mLogTag, "Fallback in case it's not a LayerDrawable");
        progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
}

このメソッドは、特にxmlファイルのスクリーンフォルダーを特定にする必要がある場合に、XMLで宣言された元のドロウアブルの測定を、その構造の変更なしで最高の柔軟性を提供します。コード。新しいShapeDrawableをゼロから再インスタンス化することは一切ありません。

1
Pier Betos

ProgressBarの色は次のように変更できます。

/res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorAccent">#FF4081</color>
</resources>

/res/values/styles.xml

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

onCreate:

progressBar = (ProgressBar) findViewById(R.id.progressBar);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
    Drawable drawable = progressBar.getIndeterminateDrawable().mutate();
    drawable.setColorFilter(ContextCompat.getColor(this, R.color.colorAccent), PorterDuff.Mode.SRC_IN);
    progressBar.setIndeterminateDrawable(drawable);
}
1
Milan Hlinák

必要な背景を描画可能なリソースを作成します。私の場合は、bg_custom_progressbar.xmlという名前を付けました。

<?xml version="1.0" encoding="utf-8"?>
<item>
    <shape Android:shape="rectangle" >
        <corners Android:radius="5dp"/>

        <gradient
            Android:angle="180"
            Android:endColor="#DADFD6"
            Android:startColor="#AEB9A3" />
    </shape>
</item>
<item>
    <clip>
        <shape Android:shape="rectangle" >
            <corners Android:radius="5dp" />

            <gradient
                Android:angle="180"
                Android:endColor="#44CF4A"
                Android:startColor="#2BB930" />
        </shape>
    </clip>
</item>
<item>
    <clip>
        <shape Android:shape="rectangle" >
            <corners Android:radius="5dp" />

            <gradient
                Android:angle="180"
                Android:endColor="#44CF4A"
                Android:startColor="#2BB930" />
        </shape>
    </clip>
</item>

次に、このカスタム背景を次のように使用します

 <ProgressBar
                Android:id="@+id/progressBarBarMenuHome"
                style="?android:attr/progressBarStyleHorizontal"
                Android:layout_width="match_parent"
                Android:layout_height="20dp"
                Android:layout_marginStart="10dp"
                Android:layout_marginEnd="10dp"
                Android:layout_marginBottom="6dp"
                Android:indeterminate="false"
                Android:max="100"
                Android:minWidth="200dp"
                Android:minHeight="50dp"
                Android:progress="10"
                Android:progressDrawable="@drawable/bg_custom_progressbar" />

私にとってはうまくいく

0
Juyel Rana

APIレベル21以上の場合、次のXML属性を使用できます。

<!-- For indeterminate progress bar -->
Android:indeterminateTint="@color/white"
<!-- For normal progress bar -->
Android:progressTint="@color/white"
0
Ghanshyam Nayma

上記の答えは背景色全体を変更しますが、プログレスバーの高さを非常に最大に変更するのはアンビオです。xmlでは変更できません。 20%の赤色、50%の黄色、70%以上の緑色で完了した進捗状況のみを変更するより良い方法。 Javaでプログラムで実行できます。

他の解決策がある場合は、回答を共有してください。

0
Mubashar

最終的なLayerDrawableレイヤー=(LayerDrawable)progressBar.getProgressDrawable(); layers.getDrawable(2).setColorFilter(color、PorterDuff.Mode.SRC_IN);

0
user3135773