Cómo cambiar el color de progreso de la barra de progreso en Android
Frecuentes
Visto 634,911 equipos
521
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)?
30 Respuestas
305
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
501
Para una barra de progreso horizontal, puede utilizar un ColorFilter
, también, así:
progressBar.getProgressDrawable().setColorFilter(
Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
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));
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
436
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
239
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);
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
204
Esta es una pregunta antigua, pero el uso de tema no se menciona aquí. Si su tema predeterminado está usando AppCompat
, su ProgressBar
el color será colorAccent
has definido.
Cambiar colorAccent
también cambiará tu ProgressBar
El 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 elandroid: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
63
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
46
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
34
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
@ateiob he escrito una nueva respuesta para explicar ... - Richard Le Mésurier
30
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
24
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 ProgressBar
color. - Enrique de Sousa
21
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>
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
18
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 comoR.drawable.filename
, debes recuperarlo comoDrawable
: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
18
android:progressTint="#ffffff"
Respondido el 14 de Septiembre de 16 a las 14:09
15
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
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 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
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);
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
13
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
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"/>
Respondido 01 ago 17, 16:08
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"/>
contestado el 23 de mayo de 17 a las 20:05
8
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.
Respondido el 20 de junio de 20 a las 10:06
7
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
7
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
6
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
6
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
6
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
6
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
4
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
4
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.
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 android material-design android-progressbar progress-indicator or haz tu propia pregunta.
¿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/… - fupsduck
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. - WhiteTigerK
android:indeterminateTint="@android:color/white"
funciona solo en API> = 21 - Madeyedexter