Hay 3 formas de resolver esta pregunta:
- Cómo ajustar el color de la barra de progreso de forma declarativa
- Cómo ajustar el color de la barra de progreso mediante programación, pero elegir el color de varios colores predeterminados declarados antes del tiempo de compilación
- Cómo ajustar el color de la barra de progreso mediante programación y también crear el color mediante programación.
En particular, hay mucha confusión en torno al # 2 y # 3, como se ve en los comentarios a la respuesta de amfcosta. Esa respuesta arrojará resultados de color impredecibles en cualquier momento que desee establecer la barra de progreso en cualquier cosa, excepto los colores primarios, ya que solo modifica el color de fondo, y el área de "clip" de la barra de progreso real seguirá siendo una superposición amarilla con opacidad reducida. Por ejemplo, el uso de ese método para establecer el fondo en púrpura oscuro dará como resultado un color de "clip" de la barra de progreso de un color rosado loco resultante de la mezcla de púrpura oscuro y amarillo a través de alfa reducido.
De todos modos, Ryan responde # 1 perfectamente y Štarke responde la mayor parte de # 3, pero para aquellos que buscan una solución completa para # 2 y # 3:
Cómo ajustar el color de la barra de progreso mediante programación, pero elegir el color de un color predeterminado declarado en XML
res / drawable / my_progressbar.xml :
Cree este archivo pero cambie los colores en my_progress y my_secondsProgress:
(NOTA: Esta es solo una copia del archivo XML real que define la barra de progreso del SDK de Android predeterminado, pero he cambiado los ID y los colores. El original se llama 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>
En tu 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)
Cómo ajustar el color de la barra de progreso mediante programación y también crear el color mediante programación
EDITAR: encontré el tiempo para resolver esto correctamente. Mi respuesta anterior dejó esto un poco ambiguo.
Un ProgressBar se compone como 3 Drawables en un LayerDrawable.
- La capa 1 es el fondo
- La capa 2 es el color de progreso secundario
- La capa 3 es el color principal de la barra de progreso
En el siguiente ejemplo, cambiaré el color de la barra de progreso principal a cian.
//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);
Ese ejemplo lo configuró en un color sólido. Puede establecerlo en un color degradado reemplazando
shpDrawable.getPaint().setColor(Color.CYAN);
con
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Salud.
-Lanza