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

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 usando code (no XML)?

preguntado el 07 de enero de 10 a las 11:01

¿Ha probado MyProgressBar.setProgressDrawable (Drawable d) especificando un mapa de bits con el color que desea? desarrollador.android.com/reference/android/widget/… desarrollador.android.com/reference/android/graphics/drawable/… -

Sí, lo he probado 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 solo de la barra. Gracias. -

android:indeterminateTint="@android:color/white" funciona solo en API> = 21 -

30 Respuestas

Lamento que no sea la respuesta, pero ¿qué está impulsando el requisito de establecerlo desde el código? Y .setProgressDrawable debería funcionar si está definido 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>

Respondido 27 Abr '15, 12:04

La razón es porque estoy creando la barra de progreso dinámicamente y estableciendo su color a pedido del usuario. Dado que suelo utilizar código para crear la pantalla y los componentes de mi GUI, no estoy familiarizado con el XML adjunto y no sé qué es una lista de capas (aunque supongo que está creando la barra de progreso basada en varias capas ..). En caso de que quiera usar el XML que ha adjuntado, ¿dónde debería colocarlo en la carpeta del proyecto y hay algo más que deba hacer para crear una barra de progreso basada en la configuración XML? Gracias. - BlancoTigreK

Guarde este xml como un archivo y póngalo en la carpeta dibujable (digamos my_progress.xml) y luego lo configura como dibujable en MyProgressBar.setProgressDrawable () Para cambiar los colores, deberá cambiar esos valores en @ color / progress_start @ color / progress_end Es básicamente un degradado y puedes poner hexadecimal allí. - Alex Volovoy

Nota: el archivo es la copia del que está en el SDK. He eliminado los derechos de autor aquí. Si miras en la carpeta res / drawable, verás exactamente lo que publiqué: los colores se establecen en el degradado amarillo, en lugar de colores personalizados. - Alex Volovoy

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 personalizada en tiempo de ejecución. pero no pude. por favor ayúdame a resolver mi problema .. después de que el progreso alcance el 100%, entonces ese tiempo cambia el color y comienza el progreso .. descargo el código de esto ..stackoverflow.com/questions/18503718/… - harikrishnan

Para una barra de progreso horizontal, puede utilizar un ColorFilter, también, así:

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

ProgressBar rojo con filtro de color

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, utilice getIndeterminateDrawable() en lugar de getProgressDrawable().

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

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

ProgressBar rojo con tinte de progreso

Respondido el 24 de diciembre de 17 a las 12:12

Quería usar esta respuesta porque me parecía la más simple, pero mi barra de progreso es completamente roja independientemente del valor de progreso. ¿Está seguro del modo que debe utilizar? - LG

@resus Tengo el mismo problema, la barra estaba completamente roja y no se veía ningún progreso. Pero lo resolví cambiando Mode.SRC_IN a Mode.MULTIPLY. - Derzu

No olvides hacer lo mismo por getIndeterminateDrawable si está utilizando un progreso indeterminado. - Thommy

Tenga en cuenta que 'Modo' en este contexto se refiere a android.graphics.PorterDuff.Mode - 1owk3y

¿Cómo no cambiar el color de fondo? Solo quiero cambiar el color del progreso. - Kangear

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+

Respondido el 17 de junio de 19 a las 12:06

Requiere un nivel mínimo de API 21 - zumo de manzana

También existen métodos de establecimiento para estas propiedades que se pueden llamar si se debe establecer un color dinámico. - carreras

¿Tengo que crear un archivo de recursos personalizado para api 21+ y api <= 20? ¿O esos atributos simplemente se ignoran en api <= 20? - prom85

@shriduttkothari ¿cómo puede ser el mejor? ... desde 21+ - user25

La mejor respuesta a medida que Android se aleja del mínimo 4.x: tom

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

Ejemplo en el que se establece el color en rojo:

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

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

enter image description here

Respondido 31 Jul 12, 08:07

Me gusta más tu respuesta. Para que el mío funcione, tuve que hacer esto: myProgressBarSpinner.getIndeterminateDrawable (). SetColorFilter (new LightingColorFilter (0xFF000000, foregroundColorDesired)); - Arte Geigel

También tenga en cuenta que al hacer esto, se modificarán los elementos de diseño de TODAS las barras de progreso en su aplicación. Para hacer esto solo para uno en particular, llame a mutate () en drawable, luego configure el filtro de color en él y luego llame a setIntederminateDrawable en su progressBar. - dimsuz

NB: Aquellos que usan esto y se preguntan por qué su color no se ve exactamente como la cuerda hexagonal que pusieron, tiene un filtro de colores múltiples. Cambio android.graphics.PorterDuff.Mode.MULTIPLY a PorterDuff.Mode.SRC_IN y obtendrás el color hexadecimal exacto. - mickguyen

Creo que solo necesita esta respuesta ... android: indeterminateTint = "@ android: color / black" - Muhammad Adil

utilicé como: progressBar = (ProgressBar) findViewById (R.id.progressBar); progressBar.getIndeterminateDrawable (). setColorFilter (ContextCompat.getColor (esto, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY); - ashishdhiman2007

Esta es una pregunta antigua, pero el uso de tema no se menciona aquí. Si su tema predeterminado está usando AppCompat, su ProgressBarel color será colorAccent has definido.

Cambiar colorAccent también cambiará tu ProgressBarEl color, pero los cambios también se reflejan en varios lugares. Por lo tanto, si desea un color diferente solo para un PregressBar puedes hacerlo aplicando un 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 ProgressBar añade el android:theme atributo:

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

Entonces se verá algo como esto:

<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 colorAccent para tu particular ProgressBar.

Nota: Utilizando style no trabajará. Necesitas usar android:theme solo. Puede encontrar más uso del tema aquí: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH

Respondido 09 Jul 16, 14:07

¡finalmente! gracias, parece que no muchos desarrolladores usan AppCompat, muchos usuarios solo votan con una solución para API 21+, nada bueno, deberían admitir más dispositivos / sistemas operativos como sea posible - user25

¡Impresionante! Funcionó para mí, pero tenía que asegurarme de que hubiera un parent = "@ style / Theme.AppCompat" en algún lugar de la jerarquía de estilos. Tenía otro padre y no funcionó al principio. - Desarrollador nublo

@Nublodeveloper Sí, lo mencioné en la primera línea si lo has notado. - kirtan403

@ kirtan403 Ah, sí, lo entiendo ahora que lo mencionas, pero no lo entendí de esa manera cuando lo leí por primera vez. Lo leí demasiado rápido y estaba buscando un código. Gracias de todos modos, ¡tu respuesta es la mejor para mí! - Desarrollador nublo

+1 Me gustó tu solución. Pero, ¿cómo establecer el color del tema en java? Por ejemplo si quiero que sea rojo # ff5900 - maseed

Toda la API

si usa todas las API, simplemente cree el tema con estilo

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

API nivel 21 y superior

si se usa en el nivel de API 21 y superior, simplemente use este código:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

Respondido el 24 de Septiembre de 18 a las 15:09

Bien, creo que el método style.xml es el mejor. (No es necesario por encima de 20 api) - iamkdblue

Esto funciona para mi. También funciona para versiones inferiores. 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"
   />

Respondido el 25 de Septiembre de 19 a las 06:09

He implementado esto en el CriptoTweets aplicación de muestra. Descubrí que el tema principal no es necesario para que esta solución funcione como se esperaba. parent="ThemeOverlay.AppCompat.Light" - Adán Hurwitz

La solución más simple si desea teñir la barra de progreso predeterminada. Gracias - saul_programa

@Saul_programa Me alegra saber que te ayuda - Devinder Jhinjer

De acuerdo con algunas de las sugerencias, PUEDE especificar una forma y un clipdrawable con un color, luego establecerlo. Tengo esto funcionando 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);

respondido 06 mar '11, 09:03

Probé el código anterior, desafortunadamente solo da como resultado una barra de progreso "vacía". ¿Me estoy perdiendo de algo? - Océano azul

Debe llamar a setLevel en ClipDrawable. Toma un valor de 0 a 10000. Por lo tanto, progress.setLevel (2500) estaría completo en un 25%. - felizingeniero

Envié una edición a la respuesta que explica un motivo de una barra de progreso "vacía" y 2 formas de solucionarlo (incluida la solución de @ HappyEngineer) - Richard Le Mésurier

@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

Esto funcionó para mí:

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

Respondido 06 Jul 17, 06:07

Solo se usa en API nivel 21 y superior - Numair

si es indeterminado:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

respondido 22 mar '15, 18:03

Usé esto, pero no se anima, solo se ha aplicado color ... Estoy usando una barra de progreso circular - Manikandan

Hoy en día, en 2016, descubrí que algunos dispositivos anteriores a Lollipop no cumplen con los colorAccent configuración, por lo que mi solución final para todas las API es ahora 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!

Respondido 21 Abr '17, 11:04

No olvides llamar wrapDrawable.mutate() DrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light)); - Tarsem Singh

Solo lo probé (nuevamente) en un nuevo emulador 4.4.2 y funciona sin ningún problema, verifique su .xml configuración y también si algo más está anulando la ProgressBarcolor. - Enrique de Sousa

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

progresodibujable.xml:
Aquí usa degradado para cambiar el color a tu gusto. Y android: toDegrees = "X" aumenta el valor de X y la barra de progreso gira rápidamente. Disminuye y gira lento. Personaliza según tus 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: enter image description here

Respondido el 31 de enero de 18 a las 06:01

@Ixx cuando se ejecuta, se ve bien. ¡De todos modos puedes cambiar el color! - Debasish Ghosh

Resuelva el mismo problema mientras trabaja en la modificación de 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, usa myProgressBar.setProgressDrawable(...), sin embargo, no puede referirse a su diseño personalizado como R.drawable.filename, debes 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')

Respondido 28 Feb 11, 12:02

android:progressTint="#ffffff" 

Respondido el 14 de Septiembre de 16 a las 14:09

Probablemente haya una cosa a la que no se haya hecho referencia en esta respuesta:

Si su tema es heredado de Theme.AppCompat, ProgressBar asumirá el color que definiste como "colorAccent" en tu tema.

Entonces, usando ..

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

... teñirá el color de ProgressBar automágicamente a la @color/custom_color .

Respondido el 21 de enero de 16 a las 18:01

Necesitaba usar @ color / resaltar - tonificantes

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 funcionará 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!

Respondido el 04 de diciembre de 17 a las 16:12

¡Gracias! Funciona para indeterminado ProgressBar, pero para determinarlo pinta con color toda la escala. - CoolMind

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

Respondido el 16 de diciembre de 15 a las 11:12

Hice lo mismo, más el cambio de color de fondo: layerDrawable.findDrawableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC); - kamen dobrev

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 dibujo de progreso, el color de fondo también cambia. - m_katsifarakis

La solución más simple si desea cambiar el color en el archivo xml de diseño, use el siguiente código y use tinte indeterminado propiedad 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" />

respondido 25 nov., 17:04

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

Respondido 01 ago 17, 16:08

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

contestado el 23 de mayo de 17 a las 20:05

Para cambiar el color de la barra de progreso horizontal (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 la barra de progreso:

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, por último, normalmente tiñe el progreso previo a la piruleta.

progreso teñido en api 19

Respondido el 20 de junio de 20 a las 10:06

La forma más sencilla de cambiar el color de primer plano y de fondo de una barra de progreso es

<ProgressBar
                        style="@android:style/Widget.ProgressBar.Horizontal"
                        android:id="@+id/pb_main"
                        android:layout_width="match_parent"
                        android:layout_height="8dp"
                        android:progress="30"
                        android:progressTint="#82e9de"
                        android:progressBackgroundTint="#82e9de"
                        />

solo agrega

                        android:progressTint="#82e9de" //for foreground colour
                        android:progressBackgroundTint="#82e9de" //for background colour

Respondido 18 Abr '20, 07:04

Debe indicar que esto funciona solo para la API de Android> 21 - emi raz

Simplemente use:

DrawableCompat.setTint(progressBar.getIndeterminateDrawable(),yourColor)

contestado el 03 de mayo de 20 a las 15:05

¡Esto es realmente simple y parece funcionar bien! Gracias - noGeek

Para SDK ver 21 y superior

android:indeterminateTint="@color/orange"

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

respondido 17 mar '21, 14:03

Si desea cambiar para toda la aplicación, cambie el valor de # FE6C27 . en su Values ​​/ colors.xml. - mughil

Estilo de material personalizado de la barra de progreso horizontal:

Para cambiar el color del 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 verificación de barra de progreso personalizada http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples

Respondido el 21 de Septiembre de 17 a las 15:09

esto requiere un nivel mínimo de API 21 - Shihab Udin

Use el android.support.v4.graphics.drawable.DrawableCompat:

            Drawable progressDrawable = progressBar.getIndeterminateDrawable();
            if (progressDrawable  != null) {
                Drawable mutateDrawable = progressDrawable.mutate();
                DrawableCompat.setTint(mutateDrawable, primaryColor);
                progressBar.setProgressDrawable(mutateDrawable);
            }

respondido 15 mar '18, 13:03

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


Puedo decir que hay (o al menos había, en el momento de escribir este artículo cuando miré la versión actual del código fuente de Android) un error / problema / optimización en el ProgressBar código que ignora un intento de establecer el progreso en un valor en el que ya se encuentra.

  • es decir, si el 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 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.


Para resumir:

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

A continuación se muestra 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.

Respondido el 15 de diciembre de 18 a las 20:12

Gracias ... esto funciona de hecho ... pero como mi dibujable era estático (de los recursos) ... no funcionó. Solo funcionó después de que agregué "drawable.invalidateSelf ();" antes de 'setProgress (0)' y 'setProgressDrawable (dibujable)' - Alecio Carvalho

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

Respondido 10 ago 19, 16:08

Para un ProgressBar de estilo horizontal 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.

Respondido 27 Oct 12, 17:10

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

Utilice este tipo de imagen para la barra de progreso. enter image description here

Para obtener mejores resultados, puede utilizar varias imágenes de progreso. Y no dude en usar imágenes, porque la propia plataforma Android usa imágenes para la barra de progreso. El código se extrae de sdk :)

Respondido el 26 de Septiembre de 15 a las 14:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.