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


¿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>

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


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+


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í


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


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

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

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


32

Esto funcionó para mí:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

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

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

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!


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í


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

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.


1
Necesitaba usar <item name = "android: colorAccent"> @ color / highlight </item>
tonisives el


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!


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

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

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

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

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


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


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.


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

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

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.


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


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.


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

4
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);

Increíble. Solución rápida y efectiva. ¡Gracias!
Tobias Reich
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.