2012-03-23 19 views
9

ho SeekBar personalizzato e posso cambiare il colore nel onProgressChanged impostando un nuovo progresso drawable:Cambiare il colore di un SeekBar sulla onProgressChanged

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

ma vorrei un wich SeekBar ha un colore solido da verde a rosso a seconda dell'avanzamento. C'è un modo per usare qualcosa come un colore sfumato quindi non ho bisogno di creare come 100 drawable questo?

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

Per coloro che sono interessati alla soluzione. Io uso il seguente codice:

questo metodo per impostare il colore:

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

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

risposta

24

mi fare qualcosa di simile con questo metodo:

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

} 

Poi, quando si aggiorna lo stato di avanzamento, devi solo cambiare il colore desiderato.

+0

Thnx, questo mi ha aiutato molto :) – Luciano

+0

Come posso accedere al R.id.progressshape che viene utilizzato di default? – snapfractalpop

+3

"android.R.id.progress" tramite codice o "@android: id/progress" via xml (non so se questo era quello che hai chiesto) – Alesqui

4

Utilizzare questa:

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

Modificare il rosso , verde, blu con cambio di progresso.

+0

thnx per aver cercato di aiutare, ma il progresso drawable deve piacere come sopra (una lista di livelli con una forma e una clip). Sai come posso creare questo drawable a livello di codice o modificare il colore della forma della clip in runtime? – Luciano

Problemi correlati