水平プログレスバーを設定しました。
黄色の進行色を変更したいです。
<ProgressBar
Android:id="@+id/progressbar"
Android:layout_width="80dip"
Android:layout_height="20dip"
Android:focusable="false"
style="?android:attr/progressBarStyleHorizontal" />
問題は、デバイスごとに進行状況の色が異なることです。だから、進行状況の色を修正してほしい。
私は自分のアプリの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>
必要に応じて色を変更できます。これにより、緑色の進行状況バーが表示されます。
より簡単なソリューション:
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>
進行状況バーの色のみを変更したい場合は、アクティビティの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スタイル属性を使用できます。
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"/>
進行状況バーが水平でも円形でもかまいません。それで全部です。
aPIレベル21以上の場合は、
Android:progressBackgroundTint="@color/yourBackgroundColor"
Android:progressTint="@color/yourColor"
この問題を解決するには3つの方法があります。
特に、amfcostaの答えへのコメントに見られるように、#2と#3については多くの混乱があります。その答えは、背景色のみを変更するため、プログレスバーを原色以外に設定したいときはいつでも予測できない色の結果をもたらし、実際のプログレスバーの「クリップ」領域は不透明度の低い黄色のオーバーレイのままです。たとえば、そのメソッドを使用して背景をダークパープルに設定すると、プログレッシブバーの「クリップ」カラーは、減少したアルファを介したダークパープルとイエローの混合に起因するクレイジーなピンク色になります。
とにかく、#1にはRyanが完全に答え、シュタルケは#3のほとんどに答えますが、#2と#3の完全な解決策を探している人には:
res/drawable/my_progressbar.xml:
このファイルを作成しますが、my_progressおよびmy_secondsProgressの色を変更します。
(注:これは、デフォルトのAndroid SDK ProgressBarを定義する実際のXMLファイルの単なるコピーですが、IDと色を変更しました。元の名前はprogress_horizontalです)
<?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として構成されます。
以下の例では、メインプログレスバーの色をシアンに変更します。
//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);
乾杯。
-ランス
プログラムでそれを行う方法を探している人向け:
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をドロウアブルに設定することは非常に重要であり、境界とプログレスバーの実際の状態を保持します。
私が見つけた最も簡単な解決策は次のようなものです:
<item name="colorAccent">@color/white_or_any_color</item>
上記をstyles.xml
フォルダーの下のres > values
ファイルに入れます。
注:他のアクセントカラーを使用する場合は、以前のソリューションで問題ないはずです。
API 21以降
あなたたちは本当に私に頭痛を与えています。できることは最初に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をゼロから再インスタンス化することは一切ありません。
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);
}
必要な背景を描画可能なリソースを作成します。私の場合は、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" />
私にとってはうまくいく
APIレベル21以上の場合、次のXML属性を使用できます。
<!-- For indeterminate progress bar -->
Android:indeterminateTint="@color/white"
<!-- For normal progress bar -->
Android:progressTint="@color/white"
上記の答えは背景色全体を変更しますが、プログレスバーの高さを非常に最大に変更するのはアンビオです。xmlでは変更できません。 20%の赤色、50%の黄色、70%以上の緑色で完了した進捗状況のみを変更するより良い方法。 Javaでプログラムで実行できます。
他の解決策がある場合は、回答を共有してください。
最終的なLayerDrawableレイヤー=(LayerDrawable)progressBar.getProgressDrawable(); layers.getDrawable(2).setColorFilter(color、PorterDuff.Mode.SRC_IN);