この問題を解決するには、次の 3 つの方法があります。
- プログレスバーの色を宣言的に調整する方法
- プログレスバーの色をプログラムで調整する方法ですが、コンパイル時の前に宣言されたさまざまな事前定義された色から色を選択します
- プログレスバーの色をプログラムで調整する方法、およびプログラムで色を作成する方法。
特に、amfcosta の回答へのコメントに見られるように、#2 と #3 の周りに多くの混乱があります。その答えは、プログレスバーを原色以外に設定したいときはいつでも予測できない色の結果をもたらします。これは、背景色を変更するだけであり、実際のプログレスバーの「クリップ」領域は不透明度が低下した黄色のオーバーレイのままです。たとえば、その方法を使用して背景を濃い紫に設定すると、プログレス バーの「クリップ」カラーが、アルファを減らして濃い紫と黄色が混ざり合ったクレイジーなピンクがかった色になります。
とにかく、#1 は Ryan によって完全に答えられ、Štarke は #3 のほとんどに答えますが、#2 と #3 の完全な解決策を探している人のために:
プログレスバーの色をプログラムで調整するが、XML で宣言された所定の色から色を選択する方法
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 として構成されます。
- レイヤー1は背景です
- レイヤー 2 は二次進行色です
- レイヤー 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);
乾杯。
-ランス