Ada 3 cara untuk menyelesaikan pertanyaan ini:
- Cara menyesuaikan warna progressbar secara deklaratif
- Cara menyesuaikan warna progressbar secara terprogram, tetapi memilih warna dari berbagai warna yang telah ditentukan yang dinyatakan sebelum waktu kompilasi
- Cara menyesuaikan warna progressbar secara terprogram, dan juga membuat warna secara terprogram.
Secara khusus ada banyak kebingungan di sekitar # 2 dan # 3, seperti terlihat dalam komentar untuk jawaban amfcosta. Jawaban itu akan menghasilkan hasil warna yang tidak dapat diprediksi kapan saja Anda ingin mengatur progressbar ke apa pun kecuali warna primer, karena hanya memodifikasi warna latar belakang, dan area "clip" progress bar yang sebenarnya masih akan menjadi overlay kuning dengan opacity berkurang. Misalnya, menggunakan metode itu untuk mengatur latar belakang ke ungu gelap akan menghasilkan progress bar "klip" warna beberapa warna merah muda gila yang dihasilkan dari pencampuran ungu gelap dan kuning melalui alpha berkurang.
Jadi bagaimanapun, # 1 dijawab dengan sempurna oleh Ryan dan Štarke menjawab sebagian besar dari # 3, tetapi bagi mereka yang mencari solusi lengkap untuk # 2 dan # 3:
Cara menyesuaikan warna progressbar secara terprogram, tetapi pilih warna dari warna yang telah ditentukan yang dinyatakan dalam XML
res / drawable / my_progressbar.xml :
Buat file ini tetapi ubah warna dalam my_progress dan my_secondsProgress:
(CATATAN: Ini hanya salinan file XML aktual yang mendefinisikan SDK ProgressBar android default, tapi saya telah mengubah ID dan Warna. Dokumen aslinya bernama 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>
Di Jawa Anda :
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)
Cara menyesuaikan warna progressbar secara terprogram, dan juga membuat warna secara terprogram
EDIT: Saya menemukan waktu untuk menyelesaikan ini dengan benar. Jawaban saya sebelumnya meninggalkan ini agak ambigu.
ProgressBar terdiri dari 3 Drawables dalam sebuah LayerDrawable.
- Layer 1 adalah latar belakangnya
- Lapisan 2 adalah warna kemajuan sekunder
- Layer 3 adalah warna progress bar utama
Pada contoh di bawah ini saya akan mengubah warna progress bar utama menjadi cyan.
//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);
Contoh itu mengaturnya ke warna solid. Anda dapat mengaturnya ke warna gradien dengan mengganti
shpDrawable.getPaint().setColor(Color.CYAN);
dengan
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Bersulang.
-Tombak