Bu soruyu çözmenin 3 yolu vardır:
- İlerleme çubuğu rengini bildirici olarak ayarlama
- İlerleme çubuğu rengini programlı olarak ayarlama, ancak derleme saatinden önce belirtilen çeşitli önceden belirlenmiş renklerden rengi seçme
- İlerleme çubuğu rengini programlı olarak ayarlama ve ayrıca rengi programlı olarak oluşturma.
Özellikle amfcosta'un cevabına yapılan yorumlarda görüldüğü gibi # 2 ve # 3 hakkında çok fazla karışıklık var. Bu yanıt, ilerleme çubuğunu yalnızca arka plan rengini değiştirdiğinden ve gerçek ilerleme çubuğu "klip" alanı azaltılmış opaklığa sahip sarı bir kaplama olacağından, ilerleme çubuğunu birincil renkler dışında herhangi bir şeye ayarlamak istediğinizde öngörülemeyen renk sonuçları verir. Örneğin, arka planı koyu mor olarak ayarlamak için bu yöntemi kullanmak, azaltılmış alfa ile koyu mor ve sarı karışımından kaynaklanan bazı çılgın pembemsi renkte bir ilerleme çubuğu "klip" rengiyle sonuçlanır.
Her neyse, # 1, Ryan tarafından yanıtlandı ve Štarke # 3'ün çoğuna cevap veriyor, ancak # 2 ve # 3'e tam bir çözüm arayanlar için:
İlerleme çubuğu rengini programlı olarak ayarlama, ancak XML'de bildirilen önceden belirlenmiş bir renkten rengi seçme
res / çekilebilir / my_progressbar.xml :
Bu dosyayı oluşturun ancak my_progress ve my_secondsProgress içindeki renkleri değiştirin:
(NOT: Bu, varsayılan android SDK ProgressBar'ı tanımlayan gerçek XML dosyasının bir kopyasıdır, ancak kimlikleri ve Renkleri değiştirdim. Orijinal adı progress_horizontal olarak adlandırılır)
<?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>
Java'nızda :
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)
İlerleme çubuğu rengini programlı olarak ayarlama ve ayrıca rengi programlı olarak oluşturma
EDIT: Bunu düzgün çözmek için zaman buldum. Eski cevabım bunu biraz belirsiz bıraktı.
ProgressBar, LayerDrawable'da 3 Drawable olarak oluşturulur.
- Katman 1 arka plan
- Katman 2, ikincil ilerleme rengidir
- Katman 3 ana ilerleme çubuğu rengidir
Aşağıdaki örnekte ana ilerleme çubuğunun rengini camgöbeği olarak değiştireceğim.
//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);
Bu örnek onu düz bir renge ayarladı. Değiştirerek degrade rengine ayarlayabilirsiniz.
shpDrawable.getPaint().setColor(Color.CYAN);
ile
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Şerefe.
Lance