วิธีการเปลี่ยนสีแถบความคืบหน้าของ Android


473

ฉันกำลังใช้แถบความคืบหน้าในแนวนอนในแอปพลิเคชัน Android ของฉันและฉันต้องการเปลี่ยนสีความคืบหน้า (ซึ่งเป็นสีเหลืองตามค่าเริ่มต้น) ฉันจะใช้code(ไม่ใช่ XML) ได้อย่างไร


คุณเคยลอง MyProgressBar.setProgressDrawable (Drawable d) ระบุบิตแมปด้วยสีที่คุณต้องการหรือไม่? developer.android.com/reference/android/widget/... developer.android.com/reference/android/graphics/drawable/...
fupsduck

2
ใช่ฉันได้ลองแล้ว แต่มันใช้งานไม่ได้ มันตั้งค่าสีพื้นหลังของมุมมองแถบความคืบหน้าทั้งหมดแทนที่จะตั้งค่าสีพื้นหลังของแถบตัวเองเท่านั้น ขอบคุณ
WhiteTigerK

21
android:indeterminateTint="@android:color/white"ใช้งานได้เฉพาะบน API> = 21
Madeyedexter

คำตอบ:


290

ฉันขอโทษที่มันไม่ใช่คำตอบ แต่สิ่งที่ผลักดันความต้องการในการตั้งค่าจากรหัส? และ.setProgressDrawableควรทำงานถ้ามันถูกกำหนดไว้อย่างถูกต้อง

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@android:id/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="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#80ffd300"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:angle="270"
            />
        </shape>
    </clip>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/progress_start"
                android:endColor="@color/progress_end"
                android:angle="270" 
            />
        </shape>
    </clip>
</item>

</layer-list>

4
เหตุผลก็เพราะฉันสร้างแถบความคืบหน้าแบบไดนามิกและการตั้งค่าสีตามคำขอของผู้ใช้ เนื่องจากฉันมักจะใช้รหัสในการสร้างหน้าจอ GUI และส่วนประกอบของฉันฉันไม่คุ้นเคยกับ XML ที่แนบมาและฉันไม่รู้ว่ารายการเลเยอร์คืออะไร (แม้ว่าฉันเดาว่าคุณกำลังสร้างแถบความคืบหน้าตามหลายเลเยอร์ .. ) ในกรณีที่ฉันต้องการใช้ XML ที่คุณแนบ - ฉันควรวางไว้ที่ไหนในโฟลเดอร์ของโครงการและมีอะไรอีกที่ฉันต้องทำเพื่อสร้างแถบความคืบหน้าตามการตั้งค่า XML? ขอบคุณ
WhiteTigerK

1
คุณบันทึก xml นี้เป็นไฟล์และวางไว้ในโฟลเดอร์ drawable (สมมุติว่า my_progress.xml) กว่าที่คุณตั้งไว้เป็น drawable ใน MyProgressBar.setProgressDrawable () ในการเปลี่ยนสีคุณจะต้องเปลี่ยนค่าใน @ color / progress_start @ color / progress_end เป็นพื้นลาดและคุณสามารถใส่เลขฐานสิบหกในนั้น
Alex Volovoy

3
หมายเหตุ - ไฟล์คือสำเนาของไฟล์ที่อยู่ใน SDK ฉันปล่อยลิขสิทธิ์ที่นี่ หากคุณดูในโฟลเดอร์ res / drawable คุณจะเห็นสิ่งที่ฉันโพสต์ - สีถูกตั้งค่าเป็นไล่ระดับสีเหลืองแทนสีที่กำหนดเอง
Alex Volovoy

7
มันไม่ได้แสดงการเปลี่ยนสีใด ๆ กับฉัน โปรดบอกสีที่ใช้งานได้
Praveen

สวัสดีอเล็กซ์คำตอบของคุณดีมาก แต่ฉันพยายามเปลี่ยนสีวงล้อที่กำหนดเองตอนรันไทม์ แต่ฉันทำไม่ได้ โปรดช่วยฉันแก้ปัญหาของฉัน .. หลังจากความคืบหน้าไปถึง 100% จากนั้นเวลาเปลี่ยนสีและเริ่มดำเนินการ .. ฉัน
harikrishnan

485

สำหรับ ProgressBar แนวนอนคุณสามารถใช้ a ColorFilterด้วยเช่นนี้:

progressBar.getProgressDrawable().setColorFilter(
    Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);

ProgressBar แดงใช้ฟิลเตอร์สี

หมายเหตุ:สิ่งนี้จะแก้ไขลักษณะที่ปรากฏของแถบความคืบหน้าทั้งหมดในแอปของคุณ หากต้องการแก้ไขแถบความคืบหน้าเฉพาะหนึ่งแถบให้ทำดังนี้:

Drawable progressDrawable = progressBar.getProgressDrawable().mutate();
progressDrawable.setColorFilter(Color.RED, android.graphics.PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(progressDrawable);

หาก progressBar จะไม่ทราบแน่ชัดแล้วใช้แทนgetIndeterminateDrawable()getProgressDrawable()

เนื่องจาก Lollipop (API 21) คุณสามารถตั้งค่าความคืบหน้าสี:

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

ProgressBar สีแดงใช้โทนสีความคืบหน้า


7
ฉันต้องการใช้คำตอบนี้เพราะฉันคิดว่าเป็นคำที่ง่ายที่สุด แต่แถบความคืบหน้าของฉันมีสีแดงอย่างสมบูรณ์โดยไม่ขึ้นอยู่กับมูลค่าความคืบหน้า คุณแน่ใจในโหมดที่จะใช้หรือไม่?
LG

33
@resus ฉันมีปัญหาเดียวกันแถบเป็นสีแดงเต็มและไม่เห็นความคืบหน้า แต่ฉันแก้ไขมันเปลี่ยน Mode.SRC_IN เป็น Mode.MULTIPLY
Derzu

40
อย่าลืมที่จะทำเช่นเดียวกันสำหรับgetIndeterminateDrawableถ้าคุณใช้ความคืบหน้าไม่แน่นอน
Thommy

6
ได้รับคำแนะนำ 'โหมด' ในบริบทนี้หมายถึง android.graphics.PorterDuff.Mode
1owk3y

9
จะไม่เปลี่ยนสีพื้นหลังได้อย่างไร ฉันแค่ต้องการเปลี่ยนสีความคืบหน้า
kangear

364

นี่ไม่ใช่การเขียนโปรแกรม แต่ฉันคิดว่ามันสามารถช่วยเหลือผู้คนได้มากมาย
ฉันพยายามมากและวิธีที่มีประสิทธิภาพมากที่สุดคือการเพิ่มบรรทัดนี้ใน ProgressBar ของฉันในไฟล์. xml:

            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary"

ดังนั้นในที่สุดรหัสนี้ก็ทำเพื่อฉัน:

<ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginTop="50dp"
            android:layout_marginBottom="50dp"
            android:visibility="visible"
            android:indeterminate="true"
            android:indeterminateTintMode="src_atop"
            android:indeterminateTint="@color/secondary">

วิธีนี้ใช้ได้กับAPI 21+


45
ต้องใช้ API ขั้นต่ำระดับ 21
Apfelsaft

นอกจากนี้ยังมีวิธีการตัวตั้งค่าสำหรับคุณสมบัติเหล่านี้ซึ่งสามารถเรียกได้ว่าหากต้องตั้งค่าสีแบบไดนามิก
racs

ฉันต้องสร้างไฟล์ทรัพยากรที่กำหนดเองสำหรับ api 21+ และ api <= 20 หรือไม่ หรือแอตทริบิวต์เหล่านั้นเพิ่งถูกละเว้นใน api <= 20 หรือไม่
prom85

1
@shriduttkothari เป็นอย่างไรดีที่สุด ... จาก 21+
25

2
คำตอบที่ดีที่สุดในขณะที่ Android ขยับห่างจากขั้นต่ำ 4.x
Tom

229

สำหรับแถบความก้าวหน้าที่ไม่แน่นอนของฉัน (สปินเนอร์) ฉันเพิ่งตั้งฟิลเตอร์สีลงบน drawable ใช้งานได้ดีและเพียงหนึ่งบรรทัด

ตัวอย่างการตั้งค่าสีเป็นสีแดง:

ProgressBar spinner = new android.widget.ProgressBar(
                context,
                null,
                android.R.attr.progressBarStyle);

spinner.getIndeterminateDrawable().setColorFilter(0xFFFF0000, android.graphics.PorterDuff.Mode.MULTIPLY);

ป้อนคำอธิบายรูปภาพที่นี่


16
ฉันชอบคำตอบของคุณดีที่สุด สำหรับฉันที่จะทำงานแม้ว่าฉันต้องทำเช่นนี้: myProgressBarSpinner.getIndeterminateDrawable (). setColorFilter (ใหม่ LightingColorFilter (0xFF000000, เบื้องหน้าColorDesired));
Art Geigel

4
นอกจากนี้โปรดทราบว่าการดำเนินการนี้จะแก้ไขแถบความคืบหน้าทั้งหมดในแอปของคุณ หากต้องการทำสิ่งนี้กับสิ่งที่เฉพาะเจาะจงให้เรียกใช้ mutate () บน drawable แล้วตั้งค่าตัวกรองสีจากนั้นเรียก setIntederminateDrawable บนแถบความคืบหน้าของคุณ
dimsuz

3
หมายเหตุ: ผู้ที่ใช้สิ่งนี้และสงสัยว่าทำไมสีของพวกเขาจึงดูไม่เหมือนสตริง hex ที่ใส่เข้าไปมันมีตัวกรองหลายสีอยู่ เปลี่ยนandroid.graphics.PorterDuff.Mode.MULTIPLYเป็นPorterDuff.Mode.SRC_INและคุณจะได้สีฐานสิบหกที่แน่นอน
micnguyen

ฉันคิดว่าเขาต้องการคำตอบนี้ ..... android: indeterminateTint = "@ android: color / black"
มูฮัมหมัด Adil

4
ฉันใช้เป็น: progressBar = (ProgressBar) findViewById (R.id.progressBar); progressBar.getIndeterminateDrawable (). setColorFilter (ContextCompat.getColor (นี่ android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY;
ashishdhiman2007

188

นี่เป็นคำถามเก่า แต่การใช้ชุดรูปแบบไม่ได้กล่าวถึงที่นี่ หากธีมเริ่มต้นของคุณใช้สีAppCompatของคุณProgressBarจะเป็นcolorAccentคุณได้กำหนดไว้

การเปลี่ยนcolorAccentจะเปลี่ยนProgressBarสีของคุณด้วย แต่การเปลี่ยนแปลงก็มีผลในหลาย ๆ ที่ ดังนั้นหากคุณต้องการสีที่แตกต่างสำหรับเฉพาะPregressBarคุณสามารถทำได้โดยใช้ชุดรูปแบบที่ProgressBar:

  • ขยายธีมเริ่มต้นและการแทนที่ของคุณ colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
  • และในการProgressBarเพิ่มandroid:themeคุณสมบัติ:

    android:theme="@style/AppTheme.WhiteAccent"

ดังนั้นมันจะมีลักษณะดังนี้:

<ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:padding="10dp"
        android:theme="@style/AppTheme.WhiteAccent" />

ดังนั้นคุณจะเป็นเพียงการเปลี่ยนแปลงสำหรับคุณโดยเฉพาะcolorAccentProgressBar

หมายเหตุ : การใช้styleจะไม่ทำงาน คุณต้องใช้android:themeเท่านั้น คุณสามารถค้นหาชุดรูปแบบได้มากขึ้นที่นี่: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


18
ในที่สุด! ขอบคุณดูเหมือนว่านักพัฒนาไม่กี่คนที่ใช้ AppCompat ผู้ใช้หลายคนเพียงโหวตให้คำตอบด้วยโซลูชันสำหรับ API 21+ ไม่ดีเลยพวกเขาควรสนับสนุนอุปกรณ์ / ระบบปฏิบัติการให้มากที่สุด
25

1
! น่ากลัว ใช้งานได้สำหรับฉัน แต่ฉันต้องตรวจสอบให้แน่ใจว่ามี parent = "@ style / Theme.AppCompat" อยู่ในลำดับชั้นของสไตล์ที่ฉันมีผู้ปกครองคนอื่นและมันไม่ทำงานในตอนแรก
Nublodeveloper

@Nublodeveloper ใช่ฉันพูดถึงว่าในบรรทัดแรกถ้าคุณสังเกตเห็น
kirtan403

1
@ kirtan403 อ่าใช่ฉันเข้าใจแล้วตอนนี้คุณพูดถึงแล้ว แต่ฉันไม่เข้าใจอย่างนั้นเมื่อฉันอ่านมันเป็นครั้งแรก ฉันอ่านเร็วเกินไปและฉันกำลังมองหารหัส ขอบคุณต่อไปคำตอบของคุณดีที่สุดสำหรับฉัน!
Nublodeveloper

+1 ชอบโซลูชันของคุณ แต่วิธีการตั้งค่าสีของชุดรูปแบบใน java ??? ตัวอย่างเช่นถ้าฉันต้องการให้เป็นสีแดง <color name = "red"> # ff5900 </color>
Maseed

54

API ทั้งหมด

ถ้าใช้ API ทั้งหมดเพียงแค่สร้างธีมอย่างมีสไตล์

style.xml

<resources>

    //...

    <style name="progressBarBlue" parent="@style/Theme.AppCompat">
        <item name="colorAccent">@color/blue</item>
    </style>

</resources>

และใช้งานอยู่ในระหว่างดำเนินการ

<ProgressBar
    ...
    android:theme="@style/progressBarBlue" />

API ระดับ 21 และสูงกว่า

หากใช้ใน API ระดับ 21 ขึ้นไปให้ใช้รหัสนี้:

<ProgressBar
   //...
   android:indeterminate="true"
   android:indeterminateTintMode="src_atop"
   android:indeterminateTint="@color/secondary"/>

1
ดีฉันคิดว่าวิธี style.xml นั้นดีที่สุด (ไม่จำเป็นต้องสูงกว่า 20 api)
iamkdblue

1
ทางออกที่ดีที่สุดถ้าคุณต้องการทางออกเดียวสำหรับ API ทุกตัวขอบคุณ :)
Naveen

34

ตามคำแนะนำบางอย่างคุณสามารถระบุรูปร่างและสามารถถอนได้ด้วยสีจากนั้นตั้งค่า ฉันมีสิ่งนี้ทำงานเป็นระบบ นี่คือวิธีที่ฉันทำ ..

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณนำเข้าไลบรารีที่สามารถถอดได้ ..

import android.graphics.drawable.*;

จากนั้นใช้รหัสที่คล้ายกับด้านล่าง;

ProgressBar pg = (ProgressBar)row.findViewById(R.id.progress);
final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 };
pgDrawable = new ShapeDrawable(new RoundRectShape(roundedCorners, null,null));
String MyColor = "#FF00FF";
pgDrawable.getPaint().setColor(Color.parseColor(MyColor));
ClipDrawable progress = new ClipDrawable(pgDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);
pg.setProgressDrawable(progress);   
pg.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
pg.setProgress(45);

1
ฉันลองใช้โค้ดด้านบนโชคไม่ดีที่มันส่งผลให้แถบความคืบหน้า "ว่างเปล่า" ฉันพลาดอะไรไปรึเปล่า?
OceanBlue

คุณต้องเรียก setLevel บน ClipDrawable ใช้ค่าตั้งแต่ 0 ถึง 10,000 ดังนั้น progress.setLevel (2500) จะเต็ม 25%
HappyEngineer

1
ฉันได้ส่งการแก้ไขคำตอบที่อธิบายเหตุผลหนึ่งข้อสำหรับแถบความคืบหน้า "ว่างเปล่า" - และ 2 วิธีในการแก้ไข (รวมถึงการแก้ไข @ HappyEngineer)
Richard Le Mesurier

@RichardLeMesurier คุณสามารถโพสต์คำอธิบายได้ + 2 วิธีในส่วนความคิดเห็นหรือไม่ progress.setLevel(2500)ไม่ทำงานสำหรับฉันและเห็นได้ชัดว่าการแก้ไขของคุณไม่ได้รับการยอมรับด้วยเหตุผลบางประการ ขอบคุณ +1
ateiob


32

สิ่งนี้ใช้ได้กับฉัน:

<ProgressBar
 android:indeterminateTint="#d60909"
 ... />

12
ใช้เฉพาะใน API ระดับ 21 และสูงกว่า
Numair

28

หากไม่ทราบแน่ชัด:

((ProgressBar)findViewById(R.id.progressBar))
    .getIndeterminateDrawable()
    .setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

ฉันใช้สิ่งนี้ แต่มันไม่ได้มีการเคลื่อนไหวเพียงแค่มีการใช้สีแล้ว ... ฉันใช้ ProgressBar แบบวงกลม
Manikandan

24

มันใช้งานได้สำหรับฉัน มันยังใช้งานได้กับเวอร์ชั่นที่ต่ำกว่าด้วย เพิ่มไปยัง syles.xml ของคุณ

<style name="ProgressBarTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorAccent">@color/colorPrimary</item>
</style>

และใช้แบบนี้ใน xml

<ProgressBar
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:theme="@style/ProgressBarTheme"
   />

ฉันใช้สิ่งนี้ในแอปตัวอย่างCryptoTweets ฉันพบชุดรูปแบบหลักไม่จำเป็นสำหรับโซลูชันนี้ทำงานตามที่คาดไว้ parent="ThemeOverlay.AppCompat.Light"
Adam Hurwitz

23

ทุกวันนี้ในปี 2559 ฉันพบอุปกรณ์ pre-Lollipop บางตัวไม่เคารพการcolorAccentตั้งค่าดังนั้นโซลูชันสุดท้ายของฉันสำหรับ API ทั้งหมดตอนนี้มีดังต่อไปนี้:

// fixes pre-Lollipop progressBar indeterminateDrawable tinting
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    Drawable wrapDrawable = DrawableCompat.wrap(mProgressBar.getIndeterminateDrawable());
    DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
    mProgressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
} else {
    mProgressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), android.R.color.holo_green_light), PorterDuff.Mode.SRC_IN);
}

สำหรับคะแนนโบนัสมันไม่ได้ใช้รหัสที่คัดค้าน ลองมัน!


อย่าลืมโทรหาwrapDrawable.mutate()ด้วยDrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
Tarsem Singh

ไม่ทำงานบน Android KitKat 4.4.2
pradip tilala

ลองใช้ (อีกครั้ง) บนตัวจำลอง 4.4.2 ใหม่ที่สดใหม่และทำงานได้โดยไม่มีปัญหาใด ๆ ตรวจสอบ.xmlการตั้งค่าของคุณและถ้ามีอย่างอื่นที่เอาชนะProgressBarสีได้
Henrique de Sousa

20

นี่คือสิ่งที่ฉันทำ ทำงาน

ProgressBar:

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:indeterminateDrawable="@drawable/progressdrawable"
           />

progressdrawable.xml: ที่
นี่ใช้การไล่ระดับสีเพื่อเปลี่ยนสีตามที่คุณต้องการ และ android: toDegrees = "X" มีค่าของ X และ ProgressBar หมุนเร็ว ลดและหมุนช้าปรับแต่งตามความต้องการของคุณ

<?xml version="1.0" encoding="utf-8"?>
     <rotate xmlns:android="http://schemas.android.com/apk/res/android"
            android:duration="4000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="360" >

            <shape
                android:innerRadius="20dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false" >
                <size
                    android:height="48dp"
                    android:width="48dp" />

                <gradient
                    android:centerColor="#80ec7e2a"
                    android:centerY="0.5"
                    android:endColor="#ffec7e2a"
                    android:startColor="#00ec7e2a"
                    android:type="sweep"
                    android:useLevel="false" />
            </shape>

        </rotate>

ตัวอย่าง: ป้อนคำอธิบายรูปภาพที่นี่


สิ่งนี้แสดงภาพเคลื่อนไหวที่แตกต่างไปจากเดิมอย่างสิ้นเชิง
Ixx

18

พบปัญหาเดียวกันในขณะที่ทำงานในการปรับเปลี่ยนรูปลักษณ์ / ความรู้สึกของแถบความคืบหน้าเริ่มต้น นี่คือข้อมูลเพิ่มเติมที่หวังว่าจะช่วยให้ผู้คน :)

  • ชื่อของไฟล์ xml จะต้องมีตัวอักษรเท่านั้น: a-z0-9_.(เช่น. no capitals!)
  • ในการอ้างอิง "drawable" ของคุณมันคือ R.drawable.filename
  • หากต้องการลบล้างรูปลักษณ์เริ่มต้นคุณต้องใช้myProgressBar.setProgressDrawable(...)แต่คุณไม่สามารถอ้างถึงเลย์เอาต์ที่กำหนดเองของคุณได้เช่นเดียวกับที่R.drawable.filenameคุณต้องการดึงมาเป็นDrawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
  • คุณต้องกำหนดรูปแบบก่อนที่จะตั้งค่าความคืบหน้า / ความคืบหน้ารอง / สูงสุด(การตั้งค่าหลังจากนั้นสำหรับฉันส่งผลให้แถบความคืบหน้า 'ว่าง')

15

อาจมีสิ่งหนึ่งที่ไม่ได้ถูกอ้างถึงในคำตอบนี้:

ถ้าหากธีมของคุณจะถูกสืบทอดจากTheme.AppCompat, ProgressBarจะถือว่าสีที่คุณกำหนดให้เป็น"colorAccent"ในรูปแบบของคุณ

ดังนั้นการใช้ ..

<item name="colorAccent">@color/custom_color</item>

..will ย้อมสีสีของ ProgressBar @color/custom_colorโดยอัตโนมัติไปยัง


1
ฉันต้องการใช้ <item name = "android: colorAccent"> @ color / highlight </item>
tonisives


15

คุณสามารถลองเปลี่ยนสไตล์ชุดรูปแบบหรือใช้ android: indeterminateTint = "@ color / yourColor" ได้ทุกที่ที่คุณต้องการ แต่มีวิธีหนึ่งที่จะทำงานบน Android SKD เวอร์ชันใด ๆ :

หากแถบความคืบหน้าของคุณไม่ได้กำหนดไว้โปรดใช้:

progressBar.getProgressDrawable().setColorFilter(ContextCompat.getColor(context, R.color.yourColor), PorterDuff.Mode.SRC_IN );

หากแถบความคืบหน้าของคุณไม่แน่นอนโปรดใช้:

progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(getContext(), R.color.yourColor), PorterDuff.Mode.SRC_IN );

มันเป็นเรื่องน่าเศร้าที่ Android นั้นเป็นระเบียบ!


ขอบคุณ! มันใช้งานได้โดยไม่ทราบแน่ชัดProgressBarแต่ใช้เพื่อกำหนดสีทั้งหมด
CoolMind

14

ฉันทำมันใน ProgressBar แนวนอนได้อย่างไร:

    LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
    Drawable progressDrawable = layerDrawable.findDrawableByLayerId(android.R.id.progress);
    progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);

2
ฉันทำสิ่งเดียวกันรวมทั้งการเปลี่ยนสีพื้นหลัง: layerDrawable.findDrawableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC);
Kamen Dobrev

1
คำตอบนี้พร้อมกับความคิดเห็นของ @KamenDobrev เป็นคำตอบเดียวที่ฉันต้องการ เมื่อฉันตั้งค่าฟิลเตอร์สีให้เป็นความคืบหน้า drawable สีพื้นหลังก็เปลี่ยนไปเช่นกัน
m_katsifarakis

13

วิธีแก้ปัญหาที่ง่ายที่สุดหากคุณต้องการเปลี่ยนสีในไฟล์เลย์เอาต์ xml ใช้รหัสด้านล่างและใช้คุณสมบัติindeterminateTintสำหรับสีที่คุณต้องการ

    <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyle"
      android:layout_width="wrap_content"
      android:indeterminate="true"
      android:indeterminateTintMode="src_atop"
      android:indeterminateTint="#ddbd4e"
      android:layout_height="wrap_content"
      android:layout_marginBottom="20dp"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true" />

12

วิธีนี้ใช้ได้ผลสำหรับฉัน:

<style name="Progressbar.White" parent="AppTheme">
    <item name="colorControlActivated">@color/white</item>
</style>

<ProgressBar
    android:layout_width="@dimen/d_40"
    android:layout_height="@dimen/d_40"
    android:indeterminate="true"
    android:theme="@style/Progressbar.White"/>

8

สิ่งเล็ก ๆ น้อย ๆ อีกหนึ่งโซลูชันของธีมจะทำงานหากคุณสืบทอดธีมพื้นฐานดังนั้นสำหรับแอปขนาดกะทัดรัดธีมของคุณควรเป็น:

<style name="AppTheme.Custom" parent="@style/Theme.AppCompat">
    <item name="colorAccent">@color/custom</item>
</style>

จากนั้นตั้งค่านี้ในชุดรูปแบบแถบความคืบหน้า

<ProgressBar
    android:id="@+id/progressCircle_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:theme="@style/AppTheme.Custom"
    android:indeterminate="true"/>

7

วิธีเปลี่ยนสี ProgressBar แนวนอน (เป็น kotlin):

fun tintHorizontalProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.progressTintList = ColorStateList.valueOf(color)
    } else{
        val layerDrawable = progress.progressDrawable as? LayerDrawable
        val progressDrawable = layerDrawable?.findDrawableByLayerId(android.R.id.progress)
        progressDrawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    }
}

หากต้องการเปลี่ยนสี ProgressBar ที่ไม่แน่นอน:

fun tintIndeterminateProgress(progress: ProgressBar, @ColorInt color: Int = ContextCompat.getColor(progress.context, R.color.colorPrimary)){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        progress.indeterminateTintList = ColorStateList.valueOf(color)
    } else {
        (progress.indeterminateDrawable as? LayerDrawable)?.apply {
            if (numberOfLayers >= 2) {
                setId(0, android.R.id.progress)
                setId(1, android.R.id.secondaryProgress)
                val progressDrawable = findDrawableByLayerId(android.R.id.progress).mutate()
                progressDrawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
            }
        }
    }
}

และในที่สุดมันก็มักจะแต้ม pre-lollipop progressBars

ความคืบหน้าของสีอ่อนบน api 19


6

สไตล์วัสดุที่กำหนดเองแถบความคืบหน้าในแนวนอน:

เพื่อเปลี่ยนสีของพื้นหลังและความคืบหน้าของแถบความคืบหน้าในแนวนอน

<style name="MyProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
    <item name="android:progressBackgroundTint">#69f0ae</item>
    <item name="android:progressTint">#b71c1c</item>
    <item name="android:minWidth">200dp</item>
</style>

นำไปใช้กับแถบความคืบหน้าโดยการตั้งค่าแอตทริบิวต์สไตล์สำหรับรูปแบบวัสดุที่กำหนดเองและแถบความคืบหน้าที่กำหนดเองตรวจสอบhttp://www.zoftino.com/android-progressbar-and-custom-progressbar-examples


3
ต้องใช้ api ระดับต่ำสุด 21
Shihab Uddin

6

โพสต์เพื่อเพิ่มข้อมูลเกี่ยวกับคำตอบของ PaulieG เนื่องจาก ateiob ขอให้ฉันอธิบายบางสิ่ง ...


ฉันสามารถพูดได้ว่ามี (หรืออย่างน้อยก็ในขณะที่เขียนเมื่อฉันดูที่รุ่นปัจจุบันของรหัสที่มา Android) ข้อผิดพลาด / ปัญหา / การเพิ่มประสิทธิภาพในProgressBarรหัสที่ละเว้นความพยายามที่จะตั้งค่าความคืบหน้าเป็นค่ามัน อยู่ที่

  • เช่นถ้ามีความคืบหน้า = 45, และคุณพยายามที่จะตั้งค่าให้ 45 รหัสจะทำอะไรและจะไม่วาดความคืบหน้า

หลังจากโทรProgressBar.setProgressDrawable()แถบความคืบหน้าของคุณจะว่างเปล่า (เนื่องจากคุณเปลี่ยนส่วนที่สามารถถอดออกได้)

ซึ่งหมายความว่าคุณต้องตั้งค่าความคืบหน้าและวาดใหม่ แต่ถ้าคุณเพียงแค่ตั้งค่าความคืบหน้าเป็นค่าที่เก็บรักษาไว้มันจะไม่ทำอะไรเลย

คุณต้องตั้งค่าเป็น 0 ก่อนจากนั้นเป็นค่า "เก่า" อีกครั้งและแถบจะวาดใหม่


ดังนั้นเพื่อสรุป:

  • รักษาค่าความคืบหน้า "เก่า"
  • อัปเดต drawable / color (ทำให้แถบว่าง)
  • รีเซ็ตความคืบหน้าเป็น 0 (ไม่เช่นนั้นบรรทัดถัดไปจะไม่ทำอะไรเลย)
  • รีเซ็ตความคืบหน้าเป็นค่า "เก่า" (แถบแก้ไข)
  • โมฆะ

ด้านล่างเป็นวิธีที่ฉันมีสิ่งนี้:

protected void onResume()
{
    super.onResume();
    progBar = (ProgressBar) findViewById(R.id.progress_base);

    int oldProgress = progBar.getProgress();

    // define new drawable/colour
    final float[] roundedCorners = new float[]
        { 5, 5, 5, 5, 5, 5, 5, 5 };
    ShapeDrawable shape = new ShapeDrawable(new RoundRectShape(
        roundedCorners, null, null));
    String MyColor = "#FF00FF";
    shape.getPaint().setColor(Color.parseColor(MyColor));
    ClipDrawable clip = new ClipDrawable(shape, Gravity.LEFT,
        ClipDrawable.HORIZONTAL);
    progBar.setProgressDrawable(clip);

    progBar.setBackgroundDrawable(getResources().getDrawable(
        android.R.drawable.progress_horizontal));

    // work around: setProgress() ignores a change to the same value
    progBar.setProgress(0);
    progBar.setProgress(oldProgress);

    progBar.invalidate();
}

เท่าที่โซลูชั่นของ HappyEngineer ฉันคิดว่ามันเป็นวิธีการแก้ปัญหาที่คล้ายกันในการตั้งค่าออฟเซ็ต "ความคืบหน้า" ด้วยตนเอง ไม่ว่าในกรณีใดรหัสข้างต้นควรใช้ได้กับคุณ


ขอบคุณ .. มันใช้งานได้จริง .. แต่เนื่องจาก drawable ของฉันเป็นแบบคงที่ (จากแหล่งข้อมูล) .. มันไม่ทำงาน ใช้งานได้หลังจากฉันเพิ่ม "drawable.invalidateSelf ();" ก่อนหน้า 'setProgress (0)' และ 'setProgressDrawable (drawable)'
Alécio Carvalho


5

ใช้เพียง:

PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN;
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    mode = PorterDuff.Mode.MULTIPLY;
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
    progressBar.setProgressBackgroundTintList(ColorStateList.valueOf(Color.RED));
} else {
    Drawable progressDrawable;
    progressDrawable = (progressBar.isIndeterminate() ? progressBar.getIndeterminateDrawable() : progressBar.getProgressDrawable()).mutate();
    progressDrawable.setColorFilter(context.getResources().getColor(Color.RED), mode);
    progressBar.setProgressDrawable(progressDrawable);
}

4

สำหรับ ProgressBar สไตล์แนวนอนฉันใช้:

import android.widget.ProgressBar;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.ClipDrawable;
import android.view.Gravity;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

public void setColours(ProgressBar progressBar,
                        int bgCol1, int bgCol2, 
                        int fg1Col1, int fg1Col2, int value1,
                        int fg2Col1, int fg2Col2, int value2)
  {
    //If solid colours are required for an element, then set
    //that elements Col1 param s the same as its Col2 param
    //(eg fg1Col1 == fg1Col2).

    //fgGradDirection and/or bgGradDirection could be parameters
    //if you require other gradient directions eg LEFT_RIGHT.

    GradientDrawable.Orientation fgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;
    GradientDrawable.Orientation bgGradDirection
        = GradientDrawable.Orientation.TOP_BOTTOM;

    //Background
    GradientDrawable bgGradDrawable = new GradientDrawable(
            bgGradDirection, new int[]{bgCol1, bgCol2});
    bgGradDrawable.setShape(GradientDrawable.RECTANGLE);
    bgGradDrawable.setCornerRadius(5);
    ClipDrawable bgclip = new ClipDrawable(
            bgGradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);     
    bgclip.setLevel(10000);

    //SecondaryProgress
    GradientDrawable fg2GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg2Col1, fg2Col2});
    fg2GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg2GradDrawable.setCornerRadius(5);
    ClipDrawable fg2clip = new ClipDrawable(
            fg2GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Progress
    GradientDrawable fg1GradDrawable = new GradientDrawable(
            fgGradDirection, new int[]{fg1Col1, fg1Col2});
    fg1GradDrawable.setShape(GradientDrawable.RECTANGLE);
    fg1GradDrawable.setCornerRadius(5);
    ClipDrawable fg1clip = new ClipDrawable(
            fg1GradDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL);        

    //Setup LayerDrawable and assign to progressBar
    Drawable[] progressDrawables = {bgclip, fg2clip, fg1clip};
    LayerDrawable progressLayerDrawable = new LayerDrawable(progressDrawables);     
    progressLayerDrawable.setId(0, android.R.id.background);
    progressLayerDrawable.setId(1, android.R.id.secondaryProgress);
    progressLayerDrawable.setId(2, android.R.id.progress);

    //Copy the existing ProgressDrawable bounds to the new one.
    Rect bounds = progressBar.getProgressDrawable().getBounds();
    progressBar.setProgressDrawable(progressLayerDrawable);     
    progressBar.getProgressDrawable().setBounds(bounds);

    // setProgress() ignores a change to the same value, so:
    if (value1 == 0)
        progressBar.setProgress(1);
    else
        progressBar.setProgress(0);
    progressBar.setProgress(value1);

    // setSecondaryProgress() ignores a change to the same value, so:
    if (value2 == 0)
        progressBar.setSecondaryProgress(1);
    else
        progressBar.setSecondaryProgress(0);
    progressBar.setSecondaryProgress(value2);

    //now force a redraw
    progressBar.invalidate();
  }

ตัวอย่างการโทรจะเป็น:

  setColours(myProgressBar, 
          0xff303030,   //bgCol1  grey 
          0xff909090,   //bgCol2  lighter grey 
          0xff0000FF,   //fg1Col1 blue 
          0xffFFFFFF,   //fg1Col2 white
          50,           //value1
          0xffFF0000,   //fg2Col1 red 
          0xffFFFFFF,   //fg2Col2 white
          75);          //value2

หากคุณไม่ต้องการ 'ความคืบหน้ารอง' เพียงแค่ตั้งค่า value2 เป็นค่า 1


4

ใช้สไตล์ที่กำหนดเองนี้กับแถบความคืบหน้า

<style name="customProgress" parent="@android:style/Widget.ProgressBar.Small">
        <item name="android:indeterminateDrawable">@drawable/progress</item>
        <item name="android:duration">40</item>
        <item name="android:animationCache">true</item>
        <item name="android:drawingCacheQuality">low</item>
        <item name="android:persistentDrawingCache">animation</item>
    </style>

@ drawable / progress.xml -

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_white"
    android:pivotX="50%"
    android:pivotY="50%" />

ใช้ภาพประเภทนี้สำหรับแถบความคืบหน้า ป้อนคำอธิบายรูปภาพที่นี่

เพื่อผลลัพธ์ที่ดีกว่าคุณสามารถใช้ภาพความคืบหน้าหลายภาพ และโปรดอย่าลังเลที่จะใช้รูปภาพเพราะแพลตฟอร์ม Android ใช้รูปภาพสำหรับแถบความคืบหน้า รหัสสกัดจาก sdk :)


4

ตาม muhammad-adil แนะนำสำหรับ SDK เวอร์ชั่น 21 ขึ้นไป

android:indeterminateTint="@color/orange"

ใน XML ใช้งานได้สำหรับฉันมันง่ายพอ


หากคุณต้องการเปลี่ยนสำหรับแอปทั้งหมดโปรดเปลี่ยนค่าของ <color name = "RedAccent"> # FE6C27 </color> ใน Values ​​/ colors.xml ของคุณ
mghghil

4

นี่คือรหัสสำหรับเปลี่ยนสีของ ProgressBar แบบเป็นโปรแกรม

ProgressBar progressBar = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
progressBar.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.