2012-03-23 31 views
9

tengo seekbar encargo y puedo cambiar el color en la onProgressChanged mediante el establecimiento de un nuevo progreso dibujable:Cambiar el color de una barra de búsqueda en onProgressChanged

seek.setProgressDrawable(res.getDrawable(R.drawable.seekbar_bg1)); 

pero me gustaría un wich seekbar tiene un color sólido de verde a rojo dependiendo del progreso. ¿Hay alguna manera de usar algo así como un degradado de color por lo que no necesito crear como 100 dibujables esto?

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:id="@android:id/background"> 
    <shape> 
    <solid android:color="@android:color/transparent" /> 
    </shape> 
</item> 

<item android:id="@+id/progressshape"> 
<clip> 
    <shape> 
    <solid android:color="@color/custom_yellow" /> 
    </shape> 
</clip> 
</item> 

</layer-list> 

Para aquellos que estén interesados ​​en la solución. Yo uso el siguiente código:

este método para establecer el color:

public void setProgressBarColor(int newColor){ 
    LayerDrawable ld = (LayerDrawable) getProgressDrawable(); 
    ClipDrawable d1 = (ClipDrawable) ld.findDrawableByLayerId(R.id.progressshape); 
    d1.setColorFilter(newColor, PorterDuff.Mode.SRC_IN); 
} 

y en el onProgressChanged:

if(progress <= 50){ 
       seek.setProgressBarColor(Color.rgb(255 - (255/100 * (100 - progress*2)), 255, 0)); 
}else{ 
       seek.setProgressBarColor(Color.rgb(255, 255 - (255/100 * (progress - 50)*2), 0)); 
} 

Respuesta

24

que hacer algo como esto usando este método:

public void setProgressBarColor(ProgressBar progressBar, int newColor){ 
    LayerDrawable ld = (LayerDrawable) progressBar.getProgressDrawable(); 
    ClipDrawable d1 = (ClipDrawable) ld.findDrawableByLayerId(R.id.progressshape); 
    d1.setColorFilter(newColor, PorterDuff.Mode.SRC_IN); 

} 

Entonces, cuando se actualiza el progreso, sólo hay que cambiar el color deseado.

+0

Thnx, esto me ayudó mucho :) – Luciano

+0

¿Cómo puedo acceder a la R.id.progressshape que se utiliza de forma predeterminada? – snapfractalpop

+3

"android.R.id.progress" a través del código o "@android: id/progress" a través de xml (no sé si esto fue lo que solicitó) – Alesqui

4

Utilice esta:

bar.setProgressDrawable(new ColorDrawable(Color.rgb(red, green, blue))); 

Cambie el rojo , verde, azul con cambio de progreso.

+0

thnx para tratar de ayudar, pero el progreso drawable necesita me gusta arriba (una lista de capas con una forma y un clip) .. ¿Sabes cómo puedo crear este dibujable mediante programación o edito el color de forma de clip en tiempo de ejecución? – Luciano

Cuestiones relacionadas