Existem 3 maneiras de resolver esta questão:
- Como ajustar a cor da barra de progresso declarativamente
- Como ajustar a cor da barra de progresso programaticamente, mas escolha a cor de várias cores predeterminadas declaradas antes do tempo de compilação
- Como ajustar a cor da barra de progresso programaticamente e também criar a cor programaticamente.
Em particular, há muita confusão em torno de # 2 e # 3, como visto nos comentários à resposta de amfcosta. Essa resposta produzirá resultados imprevisíveis de cores sempre que você desejar definir a barra de progresso para qualquer coisa, exceto cores primárias, pois apenas modifica a cor do plano de fundo, e a área "clipe" da barra de progresso real ainda será uma sobreposição amarela com opacidade reduzida. Por exemplo, usar esse método para definir o plano de fundo como roxo escuro resultará em uma barra de progresso com uma cor rosada louca resultante da mistura de roxo escuro e amarelo via alfa reduzido.
De qualquer forma, o nº 1 é respondido perfeitamente por Ryan e Štarke responde a maior parte do nº 3, mas para quem procura uma solução completa para os nºs 2 e 3:
Como ajustar a cor da barra de progresso programaticamente, mas escolha a cor de uma cor predeterminada declarada em XML
res / drawable / my_progressbar.xml :
Crie esse arquivo, mas altere as cores em my_progress e my_secondsProgress:
(NOTA: Esta é apenas uma cópia do arquivo XML real que define o SDK Android ProgressBar padrão do Android, mas alterei os IDs e as cores. O original é chamado progress_horizontal)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/my_progress_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="@+id/my_secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#80ff171d"
android:centerColor="#80ff1315"
android:centerY="0.75"
android:endColor="#a0ff0208"
android:angle="270"
/>
</shape>
</clip>
</item>
<item android:id="@+id/my_progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#7d2afdff"
android:centerColor="#ff2afdff"
android:centerY="0.75"
android:endColor="#ff22b9ba"
android:angle="270"
/>
</shape>
</clip>
</item>
No seu Java :
final Drawable drawable;
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < 16) {
drawable = ctx.getResources().getDrawable(R.drawable.my_progressbar);
} else {
drawable = ContextCompat.getDrawable(ctx, R.drawable.my_progressbar);
}
progressBar.setProgressDrawable(drawable)
Como ajustar a cor da barra de progresso por meio de programação e também criar a cor por meio de programação
EDIT: Encontrei tempo para resolver isso corretamente. Minha resposta anterior deixou isso um pouco ambíguo.
Um ProgressBar é composto como 3 Drawables em um LayerDrawable.
- A camada 1 é o plano de fundo
- Camada 2 é a cor do progresso secundário
- A camada 3 é a principal cor da barra de progresso
No exemplo abaixo, alterarei a cor da barra de progresso principal para ciano.
//Create new ClipDrawable to replace the old one
float pxCornerRadius = viewUtils.convertDpToPixel(5);
final float[] roundedCorners = new float[] { pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius, pxCornerRadius };
ShapeDrawable shpDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null, null));
shpDrawable.getPaint().setColor(Color.CYAN);
final ClipDrawable newProgressClip = new ClipDrawable(shpDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
//Replace the existing ClipDrawable with this new one
final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
layers.setDrawableByLayerId(R.id.my_progress, newProgressClip);
Esse exemplo definiu uma cor sólida. Você pode configurá-lo para uma cor gradiente substituindo
shpDrawable.getPaint().setColor(Color.CYAN);
com
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Felicidades.
-Lança