Cómo cambiar el color de progreso de la barra de progreso en Android

474

Estoy usando una barra de progreso horizontal en mi aplicación de Android, y quiero cambiar su color de progreso (que es amarillo por defecto). ¿Cómo puedo hacerlo usandocode (no XML)?

WhiteTigerK
fuente
¿Has probado MyProgressBar.setProgressDrawable (Drawable d) especificando un mapa de bits con el color que deseas? developer.android.com/reference/android/widget/… developer.android.com/reference/android/graphics/drawable/…
fupsduck
2
Sí, lo he intentado pero no funciona. Establece el color de fondo de toda la vista de la barra de progreso en lugar de establecer el color de fondo de solo la barra misma. Gracias.
WhiteTigerK
21
android:indeterminateTint="@android:color/white"funciona solo en API> = 21
Madeyedexter

Respuestas:

291

Lamento que no sea la respuesta, pero ¿qué impulsa el requisito de configurarlo desde el código? Y .setProgressDrawabledebería funcionar si se define correctamente

<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="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>
Alex Volovoy
fuente
44
La razón es porque estoy creando la barra de progreso dinámicamente y estableciendo su color a pedido del usuario. Como usualmente uso código para construir mi pantalla GUI y componentes, no estoy familiarizado con el XML adjunto y no sé qué es una lista de capas (aunque supongo que está construyendo la barra de progreso en función de varias capas ..). En caso de que quiera usar el XML que ha adjuntado, ¿dónde debo colocarlo en la carpeta del proyecto? ¿Hay algo más que deba hacer para crear una barra de progreso basada en la configuración de XML? Gracias.
WhiteTigerK
1
Guarda este xml como un archivo y lo coloca en la carpeta dibujable (digamos my_progress.xml) de lo que establece como dibujable en MyProgressBar.setProgressDrawable () Para cambiar los colores, deberá cambiar esos valores en @ color / progress_start @ color / progress_end Es básicamente un gradiente y puedes poner hexadecimal allí.
Alex Volovoy
3
Nota: el archivo es la copia del que está en SDK. He dejado caer el copyright aquí. Si mira en la carpeta res / drawable, verá exactamente lo que he publicado: los colores se configuran con un degradado amarillo, en lugar de colores personalizados.
Alex Volovoy
77
No me muestra ningún cambio de color. por favor diga el color que funcionó.
Praveen
Hola Alex, tus respuestas son muy agradables. pero, he intentado cambiar el color de la rueda de progreso personalizado en tiempo de ejecución. pero no pude. ayúdame a resolver mi problema ... después de que el progreso alcance el 100%, entonces cambia el color y comienza el progreso ... descargo el código de este ... stackoverflow.com/questions/18503718/…
harikrishnan
485

Para una barra de progreso horizontal, también puede usar un ColorFilter, como este:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

Red ProgressBar using color filter

Nota: Esto modifica la apariencia de todas las barras de progreso en su aplicación. Para modificar solo una barra de progreso específica, haga esto:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

Si progressBar es indeterminado, use en getIndeterminateDrawable()lugar degetProgressDrawable() .

Desde Lollipop (API 21) puede establecer un tinte de progreso:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

Red ProgressBar using progress tint

Torben Kohlmeier
fuente
77
Quería usar esta respuesta, ya que me pareció la más simple, pero mi barra de progreso es completamente roja independientemente del valor de progreso. ¿Estás seguro del modo a utilizar?
LG
33
@resus Tengo el mismo problema, la barra estaba completamente roja y no había progreso visible. Pero lo resolví cambiando Mode.SRC_IN a Mode.MULTIPLY.
Derzu
40
No olvide hacer lo mismo getIndeterminateDrawablesi está usando un progreso indeterminado.
Thommy
66
Tenga en cuenta que 'Modo' en este contexto se refiere a android.graphics.PorterDuff.Mode
1owk3y
99
¿Cómo no cambiar el color de fondo? Solo quiero cambiar el color del progreso.
kangear
364

Esto no es programático, pero creo que podría ayudar a mucha gente de todos modos.
Intenté mucho y la forma más eficiente fue agregar estas líneas a mi ProgressBar en el archivo .xml:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

Entonces, al final, este código lo hizo por mí:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

Esta solución funciona para API 21+

Firmenich
fuente
45
Requiere un nivel mínimo de API 21
Apfelsaft
También hay métodos de establecimiento para estas propiedades que se pueden invocar si se debe establecer el color dinámico.
racs
¿Tengo que hacer un archivo de recursos personalizado para api 21+ y api <= 20? ¿O se ignoran esos atributos en api <= 20?
prom85
1
@shriduttkothari ¿cómo puede ser el mejor? ... desde 21+
usuario25
2
La mejor respuesta a medida que Android se aleja del mínimo 4.x
Tom
229

Para mi barra de progreso indeterminada (spinner) acabo de configurar un filtro de color en el dibujable. Funciona muy bien y solo una línea.

Ejemplo donde configurar el color a rojo:

ProgressBar spinner = new android.widget.ProgressBar(
                context,
                null,
                android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);

ingrese la descripción de la imagen aquí

jhavatar
fuente
16
Me gusta tu respuesta lo mejor. Para que el mío funcione, tuve que hacer esto: myProgressBarSpinner.getIndeterminateDrawable (). SetColorFilter (new LightingColorFilter (0xFF000000, foregroundColorDesired));
Art Geigel
44
También tenga en cuenta que esto modificará los elementos dibujables de TODAS las barras de progreso en su aplicación. Para hacer esto solo a una particular, llame a mutate () en drawable, luego configure el filtro de color y luego llame a setIntederminateDrawable en su barra de progreso.
dimsuz
3
NB: Aquellos que usan esto y se preguntan por qué su color no se ve exactamente como la cadena hexadecimal que pusieron, tiene un filtro de Color múltiple. Cambie android.graphics.PorterDuff.Mode.MULTIPLYa PorterDuff.Mode.SRC_INy obtendrá el color hexadecimal exacto.
micnguyen
Creo que solo necesita esta respuesta ..... android: indeterminateTint = "@ android: color / black"
Muhammad Adil
44
solía como: progressBar = (ProgressBar) findViewById (R.id.progressBar); progressBar.getIndeterminateDrawable (). setColorFilter (ContextCompat.getColor (this, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
ashishdhiman2007
189

Esta es una vieja pregunta, pero el uso del tema no se menciona aquí. Si está usando su tema predeterminado AppCompat, su ProgressBarcolor serácolorAccent que haya definido.

Cambiar colorAccenttambién cambiará el ProgressBarcolor de tu, pero los cambios también se reflejan en varios lugares. Entonces, si desea un color diferente solo para un específico PregressBar, puede hacerlo aplicando el tema a eso ProgressBar:

  • Extienda su tema predeterminado y anule colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
  • Y en ProgressBaragregar el android:themeatributo:

    android:theme="@style/AppTheme.WhiteAccent"

Entonces se verá más o menos así:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

Así que solo estás cambiando un colorAccentpara tu particular ProgressBar.

Nota : El uso styleno funcionará. Solo necesitas usar android:theme. Puede encontrar más uso del tema aquí: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH

kirtan403
fuente
18
¡finalmente! gracias, parece que no muchos desarrolladores usan AppCompat, muchos usuarios simplemente votan las respuestas con la solución para API 21+, nada bueno, deberían admitir más dispositivos / SO como sea posible
user25
1
¡Increíble! Funcionó para mí, pero tenía que asegurarme de que había un parent = "@ style / Theme.AppCompat" en algún lugar de la jerarquía de estilos. Tenía otro padre y no funcionó al principio.
Nublodeveloper
@Nublodeveloper Sí, lo mencioné en la primera línea si lo has notado.
kirtan403
1
@ kirtan403 Ah, sí, lo entiendo ahora que lo mencionas, pero no lo entendí así cuando lo leí por primera vez. Lo leí demasiado rápido y estaba buscando código. Gracias de todos modos, ¡tu respuesta es la mejor para mí!
Nublodeveloper
+1 Me gustó tu solución. Pero, ¿cómo configurar el color del tema en Java? Por ejemplo, si quiero que sea rojo <color name = "red"> # ff5900 </color>
enviado el
54

Todas las API

si usa todas las API solo cree el tema con estilo

style.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

y uso en progreso

<ProgressBar
    ...
    android:theme="@style/progressBarBlue" />

Nivel API 21 y superior

si se usa en API nivel 21 y superior solo use este código:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>
Rasoul Miri
fuente
1
Niza, creo que es el mejor método style.xml (no es necesario por encima de 20 API).
iamkdblue
1
La mejor solución si desea una solución para todas las API Gracias :)
Naveen
34

según algunas de las sugerencias, PUEDES especificar una forma y un clipdrawable con un color, luego configurarlo. Tengo esto trabajando programáticamente. Así es como lo hago ...

Primero asegúrese de importar la biblioteca dibujable.

import android.graphics.drawable.*;

Luego use el código similar al siguiente;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);
PaulieG
fuente
1
Probé el código anterior, desafortunadamente solo resulta en una barra de progreso "vacía". ¿Me estoy perdiendo de algo?
OceanBlue
Debe llamar a setLevel en ClipDrawable. Toma un valor de 0 a 10000. Por lo tanto, progress.setLevel (2500) estaría lleno en un 25%.
HappyEngineer
1
He enviado una edición a la respuesta que explica una razón para una barra de progreso "vacía" - y 2 formas de arreglarla (incluida la corrección de @ HappyEngineer)
Richard Le Mesurier
@RichardLeMesurier ¿puedes publicar la explicación + 2 formas en la sección de comentarios? progress.setLevel(2500)no funciona para mí y aparentemente su edición no fue aceptada por alguna razón. Gracias. +1.
ateiob
@ateiob He escrito una nueva respuesta para explicar ...
Richard Le Mesurier
32

Esto funcionó para mí:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />
MOH3N
fuente
12
Solo se utiliza en API nivel 21 y superior
Numair
28

si indeterminado:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
el cuchillo
fuente
Usé esto, pero no se anima, solo se ha aplicado el color ... Estoy usando la barra de progreso circular
Manikandan
24

Esto funciona para mi. También funciona para la versión inferior también. Agregue esto a su syles.xml

<style name="ProgressBarTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/colorPrimary</item>
</style>

Y úsalo así en xml

<ProgressBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:theme="@style/ProgressBarTheme"
   />
Devinder Jhinjer
fuente
He implementado esto en la aplicación de muestra CryptoTweets . He descubierto que el tema principal no es necesario para que esta solución funcione como se esperaba. parent="ThemeOverlay.AppCompat.Light"
Adam Hurwitz
23

Hoy en día, en 2016, descubrí que algunos dispositivos anteriores a Lollipop no respetan la colorAccentconfiguración, por lo que mi solución final para todas las API ahora es la siguiente:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

Para los puntos de bonificación, no utiliza ningún código obsoleto. ¡Intentalo!

Henrique de Sousa
fuente
No se olvide de llamar wrapDrawable.mutate()conDrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
Tarsem Singh
No funciona en Android KitKat 4.4.2.
pradip tilala
Solo lo probé (nuevamente) en un nuevo emulador 4.4.2 nuevo y funciona sin ningún problema, verifique su .xmlconfiguración y también si algo más anula el ProgressBarcolor.
Henrique de Sousa
20

Esto es lo que hice. Trabajó.

Barra de progreso:

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdrawable.xml:
aquí use el degradado para cambiar el color a su gusto. Y android: toDegrees = "X" aumenta el valor de X y la barra de progreso gira rápidamente. Disminuya y gire lentamente. Personalice según sus necesidades.

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="4000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" >

            <shape
                android:innerRadius="20dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false" >
                <size
                    android:height="48dp"
                    android:width="48dp" />

                <gradient
                    android:centerColor="#80ec7e2a"
                    android:centerY="0.5"
                    android:endColor="#ffec7e2a"
                    android:startColor="#00ec7e2a"
                    android:type="sweep"
                    android:useLevel="false" />
            </shape>

        </rotate>

muestra: ingrese la descripción de la imagen aquí

Debasish Ghosh
fuente
Esto muestra una animación totalmente diferente (mala apariencia) que la predeterminada.
Ixx
18

Golpee el mismo problema mientras trabaja en modificar la apariencia de la barra de progreso predeterminada. Aquí hay más información que con suerte ayudará a las personas :)

  • El nombre del archivo xml solo debe contener caracteres: a-z0-9_.(es decir, ¡sin mayúsculas!)
  • Para hacer referencia a su "dibujable" es R.drawable.filename
  • Para anular el aspecto predeterminado, usted usa myProgressBar.setProgressDrawable(...), sin embargo, no solo puede referirse a su diseño personalizado R.drawable.filename, sino que debe recuperarlo como Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
  • Debe configurar el estilo antes de configurar el progreso / progreso secundario / máximo (configurarlo después para mí resultó en una barra de progreso 'vacía')
pyko
fuente
15

Probablemente hay una cosa que no se ha mencionado en esta respuesta:

Si su tema está heredando Theme.AppCompat, ProgressBarasumirá el color que definió como "colorAccent"en su tema.

Entonces, usando ...

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

.. teñirá el color del ProgressBar automáticamente para el @color/custom_color.

Henrique de Sousa
fuente
1
Necesitaba usar <item name = "android: colorAccent"> @ color / highlight </item>
tonisives el
15
android:progressTint="#ffffff" 
Pablo
fuente
15

Puede intentar cambiar sus estilos, temas o usar android: indeterminateTint = "@ color / yourColor" en cualquier lugar que desee, pero solo hay una forma de hacerlo que funcione en cualquier versión de Android SKD:

Si su barra de progreso no es indeterminada, utilice:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

Si su barra de progreso es indeterminada, utilice:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

¡Es triste que Android sea un desastre!

Adriano Moutinho
fuente
¡Gracias! Funciona para indeterminado ProgressBar, pero para determinado pinta escala completa con color.
CoolMind
14

Cómo lo hice en ProgressBar horizontal:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
mieszk3
fuente
2
Hice lo mismo, más el cambio de color de fondo: layerDrawable.findDrawableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC);
Kamen Dobrev
1
Esta respuesta junto con el comentario de @KamenDobrev es la única que realmente hizo lo que quería. Cuando solo configuro un filtro de color para el progreso dibujable, el color de fondo también cambió.
m_katsifarakis
13

La solución más simple si desea cambiar el color en el archivo xml de diseño, use el código siguiente y use la propiedad indeterminateTint para el color deseado.

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />
Naveed Ahmad
fuente
12

Esta solución funcionó para mí:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>
S. Javed
fuente
8

Una pequeña cosa más, la solución de tema funciona si hereda un tema base, por lo que para la aplicación compacta su tema debería ser:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

Y luego configure esto en el tema de la barra de progreso

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>
Calin
fuente
7

Para cambiar el color horizontal ProgressBar (en kotlin):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

Para cambiar el color indeterminado de ProgressBar:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, android.R.id.progress)
                setId(1, android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

Y, finalmente, suele teñir el progreso previo a la piruleta

progreso teñido en la API 19

Juan
fuente
6

Estilo de material personalizado de barra de progreso horizontal:

Para cambiar el color de fondo y el progreso de la barra de progreso horizontal.

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

Aplíquelo a la barra de progreso configurando el atributo de estilo, para estilos de material personalizados y barra de progreso personalizada, consulte http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples

Arnav Rao
fuente
3
esto requiere un nivel mínimo de API 21
Shihab Uddin
6

Publicado para agregar información sobre la respuesta de PaulieG , ya que ateiob me pidió que explicara algo ...


Puedo decir que hay (o al menos hubo, al momento de escribir cuando miré esa versión actual del código fuente de Android) un error / problema / optimización en el ProgressBarcódigo que ignora un intento de establecer el progreso en un valor ya está en

  • es decir, si progreso = 45, e intenta establecerlo en 45, el código no hará nada y no volverá a dibujar el progreso .

Después de llamar ProgressBar.setProgressDrawable(), su barra de progreso estará en blanco (porque cambió la parte dibujable).

Esto significa que debe establecer el progreso y volver a dibujarlo. Pero si solo establece el progreso en un valor preservado, no hará nada.

Primero debe establecerlo en 0, luego en el valor "antiguo" nuevamente y la barra se volverá a dibujar.


Entonces para resumir:

  • preservar el valor de progreso "antiguo"
  • actualizar el dibujo / color (hace que la barra esté en blanco)
  • restablecer el progreso a 0 (de lo contrario, la siguiente línea no hace nada)
  • restablecer el progreso al valor "antiguo" (barra de arreglos)
  • invalidar

A continuación hay un método que tengo que hace esto:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

En cuanto a la solución de HappyEngineer, creo que fue una solución similar, establecer manualmente el desplazamiento de "progreso". En cualquier caso, el código anterior debería funcionar para usted.

Richard Le Mesurier
fuente
Gracias ... esto funciona de hecho ... pero como mi dibujo era estático (de los recursos) ... no funcionó. Solo funcionó después de agregar "drawable.invalidateSelf ();" antes del 'setProgress (0)' y 'setProgressDrawable (dibujable)'
Alécio Carvalho
5

Utilice android.support.v4.graphics.drawable.DrawableCompat :

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }
Alécio Carvalho
fuente
5

simplemente use:

PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    mode = PorterDuff.Mode.MULTIPLY;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
    progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
    Drawable progressDrawable;
    progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
    progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
    progressBar.setProgressDrawable(progressDrawable);
}
Mohammad Fneish
fuente
4

Para un estilo horizontal ProgressBar utilizo:

import android.widget.ProgressBar;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ClipDrawable;
import android.view.Gravity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

public void setColours(ProgressBar progressBar,
                        int bgCol1, int bgCol2, 
                        int fg1Col1, int fg1Col2, int value1,
                        int fg2Col1, int fg2Col2, int value2)
  {
    //If solid colours are required for an element, then set
    //that elements Col1 param s the same as its Col2 param
    //(eg fg1Col1 == fg1Col2).

    //fgGradDirection and/or bgGradDirection could be parameters
    //if you require other gradient directions eg LEFT_RIGHT.

    GradientDrawable.Orientation fgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;
    GradientDrawable.Orientation bgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;

    //Background
    GradientDrawable bgGradDrawable = new GradientDrawable(
            bgGradDirection, new int[]{bgCol1, bgCol2});
    bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
    bgGradDrawable.setCornerRadius(5);
    ClipDrawable bgclip = new ClipDrawable(
            bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);     
    bgclip.setLevel(10000);

    //SecondaryProgress
    GradientDrawable fg2GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg2Col1, fg2Col2});
    fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg2GradDrawable.setCornerRadius(5);
    ClipDrawable fg2clip = new ClipDrawable(
            fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Progress
    GradientDrawable fg1GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg1Col1, fg1Col2});
    fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg1GradDrawable.setCornerRadius(5);
    ClipDrawable fg1clip = new ClipDrawable(
            fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Setup LayerDrawable and assign to progressBar
    Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
    LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);     
    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    //Copy the existing ProgressDrawable bounds to the new one.
    Rect bounds = progressBar.getProgressDrawable().getBounds();
    progressBar.setProgressDrawable(progressLayerDrawable);     
    progressBar.getProgressDrawable().setBounds(bounds);

    // setProgress() ignores a change to the same value, so:
    if (value1 == 0)
        progressBar.setProgress(1);
    else
        progressBar.setProgress(0);
    progressBar.setProgress(value1);

    // setSecondaryProgress() ignores a change to the same value, so:
    if (value2 == 0)
        progressBar.setSecondaryProgress(1);
    else
        progressBar.setSecondaryProgress(0);
    progressBar.setSecondaryProgress(value2);

    //now force a redraw
    progressBar.invalidate();
  }

Un ejemplo de llamada sería:

  setColours(myProgressBar, 
          0xff303030,   //bgCol1  grey 
          0xff909090,   //bgCol2  lighter grey 
          0xff0000FF,   //fg1Col1 blue 
          0xffFFFFFF,   //fg1Col2 white
          50,           //value1
          0xffFF0000,   //fg2Col1 red 
          0xffFFFFFF,   //fg2Col2 white
          75);          //value2

Si no necesita el 'progreso secundario' simplemente establezca value2 en value1.

Keith
fuente
4

Aplique este estilo personalizado a la barra de progreso.

<style name="customProgress" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress</item>
        <item name="android:duration">40</item>
        <item name="android:animationCache">true</item>
        <item name="android:drawingCacheQuality">low</item>
        <item name="android:persistentDrawingCache">animation</item>
    </style>

@ drawable / progress.xml -

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_white"
    android:pivotX="50%"
    android:pivotY="50%" />

Use este tipo de imagen para la barra de progreso. ingrese la descripción de la imagen aquí

Para un mejor resultado, puede usar múltiples imágenes de progreso. Y no dude en usar imágenes, porque la plataforma Android en sí usa imágenes para la barra de progreso. El código se extrae de sdk :)

Neo
fuente
4

Según muhammad-adil sugerido para SDK ver 21 y superior

android:indeterminateTint="@color/orange"

en XML Works para mí, es bastante fácil.

mughil
fuente
Si desea cambiar la aplicación completa, cambie el valor de <color name = "RedAccent"> # FE6C27 </color>. en su Values ​​/ colors.xml.
mughil
4

Aquí está el código para cambiar el color de ProgressBar mediante programación.

ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));
Naveen Kumar M
fuente
4
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);
Excepción de puntero nulo
fuente
Increíble. Solución rápida y efectiva. ¡Gracias!
Tobias Reich