Istnieją 3 sposoby rozwiązania tego pytania:
- Jak ustawić deklaratywnie kolor paska postępu
- Jak programowo dostosować kolor paska postępu, ale wybrać kolor z różnych z góry określonych kolorów zadeklarowanych przed kompilacją
- Jak programowo dostosować kolor paska postępu, a także programowo utworzyć kolor.
W szczególności istnieje wiele nieporozumień wokół # 2 i # 3, jak widać w komentarzach do odpowiedzi amfcosta. Ta odpowiedź przyniesie nieprzewidywalne wyniki kolorów za każdym razem, gdy zechcesz ustawić pasek postępu na cokolwiek z wyjątkiem kolorów podstawowych, ponieważ modyfikuje on tylko kolor tła, a rzeczywisty obszar „przycinania” paska postępu nadal będzie żółtą nakładką ze zmniejszonym kryciem. Na przykład, użycie tej metody do ustawienia ciemnofioletowego tła spowoduje, że pasek postępu będzie miał kolor „klipu” o szalonym różowawym kolorze, będący wynikiem mieszania ciemnego fioletu i żółtego poprzez zredukowane alfa.
Tak czy owak, odpowiedź nr 1 doskonale odpowiada Ryan i Štarke, większość odpowiedzi nr 3, ale dla tych, którzy szukają kompletnego rozwiązania nr 2 i 3:
Jak programowo dostosować kolor paska postępu, ale wybrać kolor z wcześniej określonego koloru zadeklarowanego w XML
res / drawable / my_progressbar.xml :
Utwórz ten plik, ale zmień kolory w my_progress i my_secondsProgress:
(UWAGA: to jest tylko kopia rzeczywistego pliku XML definiującego domyślny ProgressBar Android SDK, ale zmieniłem identyfikatory i kolory. Oryginał nosi nazwę 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>
W Twojej Javie :
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)
Jak programowo dostosować kolor paska postępu, a także programowo utworzyć kolor
EDYCJA: znalazłem czas na poprawne rozwiązanie tego problemu. Moja poprzednia odpowiedź pozostawiła to nieco niejednoznaczne.
ProgressBar składa się z 3 Drawables w LayerDrawable.
- Warstwa 1 to tło
- Warstwa 2 to dodatkowy kolor postępu
- Warstwa 3 to główny kolor paska postępu
W poniższym przykładzie zmienię kolor głównego paska postępu na cyjan.
//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);
Ten przykład ustawił go na jednolity kolor. Możesz ustawić go na kolor gradientu, zastępując
shpDrawable.getPaint().setColor(Color.CYAN);
z
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Twoje zdrowie.
-Lanca