Android cambia el color de la barra de progreso Horizonal

He establecido la barra de progreso horizontal.

Me gustaría cambiar el color de progreso de amarillo.

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

El problema es que el color de progreso es diferente en diferentes dispositivos. Por lo tanto, quiero que corrija el color del progreso.

Copié esto de una de mis aplicaciones, por lo que hay prob algunos atributos adicionales, pero debe darle la idea. Esto es desde el diseño que tiene la barra de progreso:

 <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" /> 

A continuación, cree un nuevo dibujable con algo similar a lo siguiente (en este caso, 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> 

Puede cambiar los colores según sea necesario, esto le dará una barra de progreso verde.

Una solución más sencilla:

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> 

Si sólo desea cambiar el color de la barra de progreso, simplemente puede utilizar un filtro de color en el método onCreate () de su actividad:

 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); 

Idea desde aquí .

Sólo tiene que hacer esto para las versiones pre-piruletas. En Lollipop puedes usar el atributo de estilo colorAccent.

Hay 3 maneras de resolver esta pregunta:

  1. Cómo ajustar el color de la barra de progreso de forma declarativa
  2. Cómo ajustar el color de la barra de progreso mediante programación, pero elija el color de varios colores predeterminados declarados antes de tiempo de compilación
  3. 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 alrededor de # 2 y # 3, como se ve en los comentarios a la respuesta de amfcosta. Esta respuesta producirá resultados de color impredecibles en cualquier momento en que desee establecer la barra de progreso en cualquier cosa, excepto en los colores primarios, ya que sólo 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, usar ese método para fijar el fondo a púrpura oscuro dará lugar a un color "clip" de la barra de progresión de un cierto color rosado loco que resulta de mezcla púrpura oscura y amarilla vía alfa reducido.

De todos modos, # 1 es respondido perfectamente por Ryan y Štarke responde la mayoría de # 3, pero para aquellos que buscan una solución completa a # 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 sólo una copia del archivo XML real que define el androide predeterminado SDK ProgressBar, pero he cambiado los ID y los colores.El original se denomina 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 su 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

EDIT: He encontrado el tiempo para resolver esto correctamente. Mi respuesta anterior dejó esto un poco ambiguo.

Un ProgressBar se compone de 3 Drawables en un LayerDrawable.

  1. La capa 1 es el fondo
  2. La capa 2 es el color de progreso secundario
  3. La capa 3 es el color de la barra de progreso principal

En el ejemplo siguiente cambiaré el color de la barra de progreso principal a cyan.

 //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 puso a un color sólido. Puede configurarlo 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); 

Aclamaciones.

-Lanza

Para cualquiera que busque cómo hacerlo programáticamente:

  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); 

El establecimiento de ids a drawables es crucial, y se encarga de preservar los límites y el estado real de la barra de progreso

La solución más simple que encontré es algo como esto:

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

Ponga lo anterior en el archivo styles.xml en la carpeta res > values .

NOTA: Si utiliza cualquier otro color de acento, entonces las soluciones anteriores deberían ser buenas para ir con.

API 21 o superior

El color de ProgressBar se puede cambiar como sigue:

/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); } 

Final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable (); Layers.getDrawable (2) .setColorFilter (color, PorterDuff.Mode.SRC_IN);

Ustedes realmente me están dando un dolor de cabeza. Lo que puedes hacer es hacer que tu lista de capas se pueda dibujar a través de xml primero (lo que significa un fondo como la primera capa, un dibujable que representa el progreso secundario como segunda capa y otro dibujable que representa el progreso primario como la última capa) El color en el código haciendo lo siguiente:

 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); } } 

Este método le dará la mejor flexibilidad de tener la medida de su original dibujable declarado en el xml, sin MODIFICACIÓN EN SU ESTRUCTURA AFTERWARDS, especialmente si necesita tener la carpeta de pantalla de archivo xml específica, a continuación, sólo modificar sólo el color a través de la código. No volver a instanciar un nuevo ShapeDrawable desde cero en absoluto.

Para API de nivel 21 o superior solo use

 android:progressBackgroundTint="@color/yourBackgroundColor" android:progressTint="@color/yourColor" 

Las respuestas anteriores cambian el color de fondo entero y es ambigios que cambie la altura de la barra de progreso a muy max.which incapaz de cambiar en xml. Mejor manera de cambiar sólo el estado de la barra de progreso que la cantidad que se completa es el 20% de color rojo, 50% de color amarillo 70% y sobre el color verde. Puede hacerlo de forma programática en java.

Comparta su respuesta si tiene alguna otra solución.

  • Android: Animación horizontal personalizada de la barra de progreso
  • Cambiar color de la barra de progreso a través de CÓDIGO SOLAMENTE en Android
  • ¿Cómo implementar una pantalla de bienvenida con una barra de progreso? androide
  • Cómo actualizar barra de progreso mediante el tema
  • ¿Cómo mostrar la animación de progreso de carga para alguna imagen?
  • show ProgressBar o Dialog de un IntentService para el progreso de la descarga
  • Android ProgressBar personalizado no está girando
  • ¿Cómo cambiar el color predeterminado de la barra de progreso?
  • android.widget.ProgressBar no se puede convertir en android.widget.LinearLayout
  • ProgressBar no se restablece a "0" al abrir la segunda vez
  • Agregar la barra de progreso en la parte inferior de una vista de lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.