มี 3 วิธีในการแก้คำถามนี้:
- วิธีการปรับสีแถบความคืบหน้าอย่างชัดเจน
- วิธีการปรับสีแถบความคืบหน้าโดยทางโปรแกรม แต่เลือกสีจากสีที่กำหนดไว้ล่วงหน้าต่างๆที่ประกาศไว้ก่อนเวลาคอมไพล์
- วิธีการปรับสีแถบความคืบหน้าโดยทางโปรแกรมและสร้างสีแบบเป็นโปรแกรม
โดยเฉพาะอย่างยิ่งมีความสับสนมากมายรอบ # 2 และ # 3 ตามที่เห็นในความคิดเห็นต่อคำตอบของ amfcosta คำตอบนั้นจะให้ผลลัพธ์สีที่ไม่สามารถคาดเดาได้ตลอดเวลาที่คุณต้องการตั้งค่าแถบความก้าวหน้าเป็นอะไรก็ได้ยกเว้นสีหลักเนื่องจากจะปรับเปลี่ยนสีพื้นหลังเท่านั้นและพื้นที่ "คลิป" แถบความคืบหน้าจริงจะยังคงเป็นสีเหลืองทับซ้อน ตัวอย่างเช่นการใช้วิธีการตั้งค่าพื้นหลังเป็นสีม่วงเข้มจะส่งผลให้แถบความคืบหน้า "คลิป" สีของสีชมพูบ้าบางอย่างที่เกิดจากการผสมสีม่วงเข้มและสีเหลืองผ่านอัลฟาลดลง
ดังนั้นไรก็ตาม # 1 ได้รับคำตอบอย่างสมบูรณ์แบบโดย Ryan และ arktarke ตอบคำถามส่วนใหญ่ใน # 3 แต่สำหรับผู้ที่กำลังมองหาโซลูชันที่สมบูรณ์สำหรับ # 2 และ # 3:
วิธีการปรับสีแถบความคืบหน้าโดยทางโปรแกรม แต่เลือกสีจากสีที่กำหนดไว้ล่วงหน้าที่ประกาศใน XML
res / drawable / my_progressbar.xml :
สร้างไฟล์นี้ แต่เปลี่ยนสีใน my_progress และ my_secondsProgress:
(หมายเหตุ: นี่เป็นเพียงสำเนาของไฟล์ XML จริง ๆ ที่กำหนดค่าเริ่มต้นของ Android SDK ProgressBar แต่ฉันได้เปลี่ยน ID และสีต้นฉบับมีชื่อว่า 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>
ใน 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)
วิธีการปรับสีแถบความคืบหน้าโดยทางโปรแกรมและสร้างสีแบบเป็นโปรแกรม
แก้ไข:ฉันพบเวลาที่จะแก้ไขปัญหานี้อย่างถูกต้อง คำตอบเดิมของฉันทำให้มันคลุมเครือเล็กน้อย
ProgressBar ประกอบด้วย 3 Drawables ใน LayerDrawable
- Layer 1 เป็นพื้นหลัง
- Layer 2 เป็นสีรองความคืบหน้า
- เลเยอร์ 3 เป็นสีแถบความคืบหน้าหลัก
ในตัวอย่างด้านล่างฉันจะเปลี่ยนสีของแถบความคืบหน้าหลักเป็นสีฟ้า
//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);
ตัวอย่างนั้นตั้งเป็นสีทึบ คุณอาจตั้งเป็นสีไล่ระดับสีโดยการแทนที่
shpDrawable.getPaint().setColor(Color.CYAN);
กับ
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
ไชโย
-Lance