Cách thay đổi màu tiến trình của thanh tiến trình trong Android


473

Tôi đang sử dụng một thanh tiến trình ngang trong ứng dụng Android của mình và tôi muốn thay đổi màu tiến trình của nó (màu Vàng theo mặc định). Làm thế nào tôi có thể làm điều đó bằng cách sử dụng code(không phải XML)?


Bạn đã thử MyProTHERBar.setProTHERDrawable (Drawable d) chỉ định một bitmap với màu bạn muốn chưa? developer.android.com/reference/android/widget/... developer.android.com/reference/android/graphics/drawable/...
fupsduck

2
Có tôi đã thử nó nhưng nó không hoạt động. Nó đặt màu nền của toàn bộ chế độ xem thanh tiến trình thay vì chỉ đặt màu nền của chính thanh đó. Cảm ơn.
WhiteTigerK

21
android:indeterminateTint="@android:color/white"chỉ hoạt động trên API> = 21
Madeyedexter

Câu trả lời:


291

Tôi xin lỗi vì đó không phải là câu trả lời, nhưng điều gì thúc đẩy yêu cầu thiết lập nó từ mã? Và .setProgressDrawablenên hoạt động nếu nó được xác định chính xác

<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
Lý do là bởi vì tôi đang tạo thanh tiến trình một cách linh hoạt và đặt màu của nó theo yêu cầu của người dùng. Vì tôi thường sử dụng mã để xây dựng các thành phần và màn hình GUI của mình, tôi không quen với XML đính kèm và tôi không biết danh sách lớp là gì (mặc dù tôi đoán rằng bạn đang xây dựng thanh tiến trình dựa trên nhiều lớp ..). Trong trường hợp tôi muốn sử dụng XML mà bạn đã đính kèm - tôi nên đặt nó ở đâu trong thư mục của dự án và tôi còn cần phải làm gì nữa để tạo một thanh tiến trình dựa trên các cài đặt XML không? Cảm ơn.
WhiteTigerK

1
Bạn lưu xml này dưới dạng tệp và đặt nó vào thư mục drawable (giả sử my_proTHER.xml) hơn là bạn đặt nó dưới dạng drawable trong MyProTHERBar.setProTHERDrawable () Để thay đổi màu sắc - bạn sẽ cần thay đổi các giá trị đó trong @ color / Progress_start @ color / Progress_end Về cơ bản, đó là một gradient và bạn có thể đặt hex vào đó.
Alex Volovoy

3
Lưu ý - tệp là bản sao của tệp trong SDK. Tôi đã bỏ bản quyền ở đây. Nếu bạn nhìn vào thư mục res / drawable, bạn sẽ thấy chính xác những gì tôi đã đăng - màu sắc được đặt thành gradient màu vàng, thay vì màu tùy chỉnh.
Alex Volovoy

7
Nó không hiển thị bất kỳ thay đổi màu sắc đối với tôi. xin vui lòng cho biết màu sắc làm việc ra.
Praveen

Xin chào Alex, câu trả lời của bạn rất hay. nhưng, tôi đang cố gắng thay đổi màu bánh xe tiến bộ tùy chỉnh trong thời gian chạy. nhưng tôi đã không thể. vui lòng giúp tôi giải quyết vấn đề của mình .. sau khi tiến trình đạt 100%, sau đó thời gian đó thay đổi màu sắc và bắt đầu tiến
trình..tôi

485

Đối với một ProgressBar ngang, bạn cũng có thể sử dụng một ColorFilter, như thế này:

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

Red ProgressBar sử dụng bộ lọc màu

Lưu ý: Điều này sửa đổi sự xuất hiện của tất cả các thanh tiến trình trong ứng dụng của bạn. Để chỉ sửa đổi một thanh tiến trình cụ thể, hãy làm điều này:

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

Nếu ProgressBar không xác định thì sử dụng getIndeterminateDrawable()thay vì getProgressDrawable().

Vì Lollipop (API 21), bạn có thể đặt màu tiến trình:

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

Red ProgressBar sử dụng tông màu tiến độ


7
Tôi muốn sử dụng câu trả lời này vì nó dường như là câu trả lời đơn giản nhất nhưng thanh tiến trình của tôi hoàn toàn màu đỏ độc lập với giá trị tiến độ. Bạn có chắc chắn về Chế độ để sử dụng không?
LG

33
@resus Tôi có cùng một vấn đề, thanh màu đỏ hoàn toàn và không thấy tiến triển. Nhưng tôi đã giải quyết nó khi thay đổi Mode.SRC_IN thành Mode.MULTIPLY.
Derzu

40
Đừng quên làm tương tự getIndeterminateDrawablenếu bạn đang sử dụng tiến trình không xác định.
Mẹ

6
Xin lưu ý, 'Chế độ' trong ngữ cảnh này đề cập đến android.graphics.PorterDuff.Mode
1owk3y

9
Làm thế nào để không thay đổi màu nền? Tôi chỉ muốn thay đổi màu tiến độ.
kangear

364

Đây không phải là lập trình nhưng tôi nghĩ nó có thể giúp được rất nhiều người.
Tôi đã thử rất nhiều và cách hiệu quả nhất là thêm dòng này vào ProgressBar của tôi trong Tệp .xml:

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

Vì vậy, cuối cùng mã này đã làm điều đó cho tôi:

<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">

Giải pháp này hoạt động cho API 21+


45
Yêu cầu API tối thiểu cấp 21
Apfelsaft

Ngoài ra còn có các phương thức setter cho các thuộc tính này có thể được gọi nếu màu động phải được đặt.
cuộc đua

Tôi có phải tạo tệp tài nguyên tùy chỉnh cho api 21+ và api <= 20 không? Hay những thuộc tính đó chỉ bị bỏ qua trong api <= 20?
prom85

1
@shriduttkothari làm thế nào nó có thể là tốt nhất? ... nó từ 21+
user25

2
Câu trả lời tốt nhất khi Android thay đổi từ mức tối thiểu 4.x
Tom

229

Đối với thanh tiến trình không xác định (spinner) tôi chỉ cần đặt bộ lọc màu trên drawable. Hoạt động tuyệt vời và chỉ một dòng.

Ví dụ trong đó cài đặt màu thành màu đỏ:

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

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

nhập mô tả hình ảnh ở đây


16
Tôi thích câu trả lời của bạn tốt nhất. Để tôi làm việc mặc dù tôi phải làm điều này: myProTHERBarSpinner.getTheeterminateDrawable (). SetColorFilter (new LightingColorFilter (0xFF000000, foregroundColorDesired));
Art Geigel

4
Cũng lưu ý rằng việc này sẽ sửa đổi các bản vẽ của TẤT CẢ các thanh tiến trình trong ứng dụng của bạn. Để chỉ thực hiện điều này với một cái cụ thể, hãy gọi mutate () trên drawable, sau đó đặt bộ lọc màu trên nó và sau đó gọi setIntederminateDrawable trên ProgressBar của bạn.
dimsuz

3
Lưu ý: Những người sử dụng điều này và tự hỏi tại sao màu sắc của họ không giống hệt như chuỗi hex họ đặt vào, nó có bộ lọc Nhiều màu trên đó. Thay đổi android.graphics.PorterDuff.Mode.MULTIPLYthành PorterDuff.Mode.SRC_INvà bạn sẽ có được màu hex chính xác.
micnguyen 17/8/2015

Tôi nghĩ rằng anh ta chỉ cần câu trả lời này ..... android: indeterminateTint = "@ android: color / black"
Muhammad Adil

4
tôi đã sử dụng như: ProgressBar = (ProgressBar) findViewById (R.id.proTHERBar); ProgressBar.getIneterminateDrawable (). setColorFilter (ContextCompat.getColor (this, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
ashishdhiman2007

188

Đây là một câu hỏi cũ, nhưng sử dụng chủ đề không được đề cập ở đây. Nếu chủ đề mặc định của bạn đang sử dụng AppCompat, ProgressBarmàu của bạn sẽ là colorAccentbạn đã xác định.

Thay đổi colorAccentcũng sẽ thay đổi ProgressBarmàu sắc của bạn , nhưng có những thay đổi cũng phản ánh ở nhiều nơi. Vì vậy, nếu bạn muốn một màu khác chỉ cho một cụ thể, PregressBarbạn có thể làm điều đó bằng cách áp dụng chủ đề cho điều đó ProgressBar:

  • Mở rộng chủ đề mặc định của bạn và ghi đè colorAccent

    <style name="AppTheme.WhiteAccent">
        <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
    </style>
  • ProgressBarthêm android:themethuộc tính:

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

Vì vậy, nó sẽ trông giống như thế này:

<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" />

Vì vậy, bạn chỉ đang thay đổi một colorAccentđặc biệt của bạn ProgressBar.

Lưu ý : Sử dụng stylesẽ không hoạt động. Bạn chỉ cần sử dụng android:theme. Bạn có thể tìm thấy nhiều sử dụng chủ đề hơn tại đây: https://plus.google.com/u/0/+AndroidDevelopers/posts/JXHKyhsWHAH


18
cuối cùng cảm ơn, có vẻ như không có nhiều nhà phát triển sử dụng AppCompat, nhiều người dùng chỉ trả lời các câu trả lời với giải pháp cho API 21+, không tốt chút nào, họ nên hỗ trợ nhiều thiết bị / HĐH nhất có thể
user25

1
Tuyệt vời! Làm việc cho tôi, nhưng tôi phải đảm bảo có cha mẹ = "@ style / Theme.AppCompat" ở đâu đó trong hệ thống phân cấp kiểu tôi có một phụ huynh khác và lúc đầu nó không hoạt động.
Nhà phát triển Nublod

@Nublodeveloper Có tôi đã đề cập rằng trong dòng đầu tiên nếu bạn đã chú ý.
kirtan403

1
@ kirtan403 À, vâng, tôi hiểu rồi, bây giờ bạn đề cập đến nó, nhưng tôi không hiểu nó theo cách đó khi lần đầu tiên đọc nó. Tôi đọc nó quá nhanh và tôi đang tìm mã. Dù sao cũng cảm ơn, câu trả lời của bạn là tốt nhất cho tôi!
Nhà phát triển Nublod

+1 Thích giải pháp của bạn. Nhưng làm thế nào để thiết lập màu sắc của chủ đề trong java ??? Ví dụ: nếu tôi muốn nó có màu đỏ <color name = "red"> # ff5900 </ color>
Maseed

54

Tất cả API

Nếu sử dụng tất cả API, chỉ cần tạo chủ đề theo phong cách

style.xml

<resources>

    //...

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

</resources>

và sử dụng trong tiến trình

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

API cấp 21 trở lên

nếu được sử dụng trong API cấp 21 trở lên, chỉ cần sử dụng mã này:

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

1
Thật tuyệt, tôi nghĩ rằng phương thức style.xml là tốt nhất. (Không cần trên 20 api)
iamkdblue

1
Giải pháp tốt nhất nếu bạn muốn một giải pháp cho tất cả các API Cảm ơn :)
Naveen

34

theo một số gợi ý, bạn CÓ THỂ chỉ định hình dạng và có thể rút ra bằng một màu, sau đó đặt nó. Tôi có điều này làm việc theo chương trình. Đây là cách tôi làm điều đó ..

Trước tiên hãy chắc chắn rằng bạn nhập thư viện drawable ..

import android.graphics.drawable.*;

Sau đó sử dụng mã tương tự như dưới đây;

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
Tôi đã thử mã ở trên, thật không may, nó chỉ dẫn đến một thanh tiến trình "trống". Tui bỏ lỡ điều gì vậy?
OceanBlue

Bạn cần gọi setLevel trên ClipDrawable. Nó nhận một giá trị từ 0 đến 10000. Vì vậy, Progress.setLevel (2500) sẽ đầy đủ 25%.
HappyEngineer

1
Tôi đã gửi bản chỉnh sửa cho câu trả lời giải thích một lý do cho thanh tiến trình "trống" - và 2 cách để khắc phục (bao gồm sửa @ HappyEngineer)
Richard Le Mesurier

@RichardLeMesurier bạn có thể đăng lời giải thích + 2 cách trong phần bình luận không? progress.setLevel(2500)không làm việc cho tôi và rõ ràng chỉnh sửa của bạn đã không được chấp nhận vì một số lý do. Cảm ơn. +1.
ateiob


32

Điều này làm việc cho tôi:

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

12
Chỉ được sử dụng trong API cấp 21 trở lên
Numair

28

nếu không xác định:

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

Tôi đã sử dụng cái này, nhưng nó không hoạt hình, chỉ màu được áp dụng ... Tôi đang sử dụng thanh tiến trình tròn
Manikandan

24

Điều này làm việc cho tôi. Nó cũng hoạt động cho phiên bản thấp hơn. Thêm phần này vào syles.xml của bạn

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

Và sử dụng nó như thế này trong xml

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

Tôi đã triển khai điều này trong ứng dụng mẫu CryptoTweets . Tôi đã tìm thấy chủ đề gốc không bắt buộc để giải pháp này hoạt động như mong đợi. parent="ThemeOverlay.AppCompat.Light"
Adam Hurwitz

23

Ngày nay, năm 2016 tôi đã tìm thấy một số thiết bị tiền Lollipop không tôn trọng colorAccentcài đặt, vì vậy giải pháp cuối cùng của tôi cho tất cả các API hiện nay là:

// 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);
}

Đối với điểm thưởng, nó không sử dụng bất kỳ mã không dùng nữa. Thử nó!


Đừng quên gọi wrapDrawable.mutate()vớiDrawableCompat.setTint(wrapDrawable.mutate(), ContextCompat.getColor(getContext(), android.R.color.holo_green_light));
Tarsem Singh

Không hoạt động trên Android KitKat 4.4.2.
pradip tilala

Chỉ cần thử nó (một lần nữa) trên một trình giả lập 4.4.2 mới và nó hoạt động mà không gặp vấn đề gì, kiểm tra .xmlcài đặt của bạn và nếu có thứ gì khác ghi đè ProgressBarmàu.
Henrique de Sousa

20

Đây là những gì tôi đã làm. Đã làm việc.

Thanh tiến trình:

<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:
Ở đây sử dụng gradient để thay đổi màu sắc theo ý muốn. Và android: toDegrees = "X" tăng giá trị của X và thanh tiến trình xoay nhanh. Giảm và nó quay chậm. Tùy chỉnh theo nhu cầu của bạn.

<?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>

mẫu vật: nhập mô tả hình ảnh ở đây


Điều này cho thấy một hình ảnh động hoàn toàn khác (nhìn xấu) so với hình ảnh mặc định.
Ixx

18

Gặp vấn đề tương tự trong khi sửa đổi giao diện của thanh tiến trình mặc định. Dưới đây là một số thông tin hy vọng sẽ giúp được mọi người :)

  • Tên của tệp xml chỉ phải chứa các ký tự: a-z0-9_.(nghĩa là không có chữ viết hoa!)
  • Để tham khảo "drawable" của bạn, nó là R.drawable.filename
  • Để ghi đè giao diện mặc định, bạn sử dụng myProgressBar.setProgressDrawable(...), tuy nhiên bạn không thể chỉ tham khảo bố cục tùy chỉnh của mình như R.drawable.filename, bạn cần truy xuất nó dưới dạng Drawable:
    Resources res = getResources();
    myProgressBar.setProgressDrawable(res.getDrawable(R.drawable.filename);
  • Bạn cần đặt kiểu trước khi đặt tiến trình / tiến trình thứ cấp / tối đa (cài đặt kiểu đó cho tôi sau đó dẫn đến thanh tiến trình 'trống')

15

Có lẽ có một điều chưa được đề cập trong câu trả lời này:

Nếu chủ đề của bạn được kế thừa từ Theme.AppCompat, ProgressBarsẽ giả sử màu bạn đã xác định là"colorAccent" trong chủ đề của mình.

Vì vậy, sử dụng ..

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

.. sẽ tô màu của ProgressBar một cách tự động cho @color/custom_color.


1
Tôi cần sử dụng <item name = "android: colorAccent"> @ color / highlight </ item>
tonisives


15

Bạn có thể thử thay đổi Kiểu, Chủ đề hoặc sử dụng Android: indeterminateTint = "@ color / yourColor" bất cứ nơi nào bạn muốn, nhưng chỉ có một cách làm như vậy sẽ hoạt động trên mọi phiên bản SKD của Android:

Nếu thanh tiến trình của bạn không vô định, vui lòng sử dụng:

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

Nếu thanh tiến trình của bạn không xác định, vui lòng sử dụng:

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

Thật đáng buồn khi Android là một mớ hỗn độn!


Cảm ơn! Nó hoạt động cho không xác định ProgressBar, nhưng để xác định nó sơn toàn bộ quy mô với màu sắc.
CoolMind

14

Làm thế nào tôi đã làm điều đó trong ProgressBar ngang:

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

2
Tôi đã làm điều tương tự, cộng với thay đổi màu nền: layerDrawable.findDrawableByLayerId (android.R.id.background) .setColorFilter (trackColor, PorterDuff.Mode.SRC);
Kamen Dobrev

1
Câu trả lời này cùng với nhận xét của @KamenDobrev là người duy nhất thực sự làm những gì tôi muốn. Khi tôi chỉ đặt bộ lọc màu theo tiến trình có thể vẽ, màu nền cũng thay đổi.
m_katsifarakis

13

Giải pháp đơn giản nhất nếu bạn muốn thay đổi màu trong tệp xml bố cục, sử dụng mã dưới đây và sử dụng thuộc tính indeterminateTint cho màu bạn muốn.

    <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

Giải pháp này hiệu quả với tôi:

<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

Một điều nữa, giải pháp chủ đề sẽ hoạt động nếu bạn kế thừa một chủ đề cơ bản, vì vậy, để ứng dụng thu gọn chủ đề của bạn phải là:

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

Và sau đó đặt điều này trong chủ đề thanh tiến trình

<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

Để thay đổi màu ProgressBar ngang (tính bằng 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)
    }
}

Để thay đổi màu ProgressBar không xác định:

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)
            }
        }
    }
}

Và cuối cùng nó thường nhuốm màu kẹo mút tiến bộ

tiến bộ trên api 19


6

Thanh ngang tùy chỉnh phong cách vật liệu:

Để thay đổi màu nền và tiến độ của thanh tiến trình ngang.

<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>

Áp dụng nó cho thanh tiến trình bằng cách đặt thuộc tính kiểu, cho các kiểu vật liệu tùy chỉnh và kiểm tra thanh tiến trình tùy chỉnh http://www.zoftino.com/android-proTHERbar-and-custom-proTHERbar-examples


3
điều này đòi hỏi mức api tối thiểu 21
Shihab Uddin

6

Đăng để thêm thông tin về câu trả lời của PaulieG , vì ateiob yêu cầu tôi giải thích điều gì đó ...


Tôi có thể nói rằng có (hoặc ít nhất là tại thời điểm viết khi tôi xem phiên bản mã nguồn Android hiện tại đó) một lỗi / vấn đề / tối ưu hóa trong ProgressBarmã mà bỏ qua nỗ lực đặt tiến trình thành giá trị của nó đã ở

  • tức là nếu tiến trình = 45 và bạn cố gắng đặt nó thành 45, mã sẽ không làm gì và sẽ không vẽ lại tiến trình .

Sau khi gọi ProgressBar.setProgressDrawable(), thanh tiến trình của bạn sẽ trống (vì bạn đã thay đổi phần có thể vẽ được).

Điều này có nghĩa là bạn cần thiết lập tiến trình và vẽ lại nó. Nhưng nếu bạn chỉ đặt tiến trình thành một giá trị được bảo tồn, nó sẽ không làm gì cả.

Trước tiên, bạn phải đặt nó về 0, sau đó trở lại giá trị "cũ" và thanh sẽ vẽ lại.


Vì vậy, để tóm tắt:

  • giữ nguyên giá trị tiến độ "cũ"
  • cập nhật drawable / color (làm trống thanh)
  • đặt lại tiến trình về 0 (nếu không thì dòng tiếp theo không làm gì cả)
  • đặt lại tiến trình về giá trị "cũ" (thanh sửa lỗi)
  • vô hiệu

Dưới đây là một phương pháp tôi có mà làm điều này:

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();
}

Theo như giải pháp của HappyEngineer, tôi nghĩ đó là một cách giải quyết tương tự, để tự thiết lập bù "tiến độ". Trong cả hai trường hợp, mã trên sẽ làm việc cho bạn.


Cảm ơn..có tác dụng thực sự..nhưng vì khả năng rút tiền của tôi là tĩnh (từ tài nguyên) .. nó không hoạt động. Nó chỉ hoạt động sau khi tôi thêm "drawable.invalidateSelf ();" trước 'setProTHER (0)' và 'setProTHERDrawable (drawable)'
Alécio Carvalho


5

chỉ cần sử dụng:

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

Đối với một ProgressBar kiểu ngang tôi sử dụng:

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();
  }

Một cuộc gọi ví dụ sẽ là:

  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

Nếu bạn không cần 'tiến trình thứ cấp', chỉ cần đặt value2 thành value1.


4

Áp dụng kiểu tùy chỉnh này cho thanh tiến trình.

<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%" />

Sử dụng loại hình ảnh này cho thanh tiến trình. nhập mô tả hình ảnh ở đây

Để có kết quả tốt hơn, bạn có thể sử dụng nhiều hình ảnh tiến bộ. Và đừng ngần ngại sử dụng hình ảnh, vì chính Nền tảng Android sử dụng hình ảnh cho thanh tiến trình. Mã được trích xuất từ ​​sdk :)


4

Theo muhammad-adil được đề xuất cho SDK ver 21 trở lên

android:indeterminateTint="@color/orange"

trong XML Works đối với tôi, là đủ dễ dàng.


Nếu bạn muốn thay đổi cho toàn bộ ứng dụng, vui lòng thay đổi giá trị của <color name = "RedAccent"> # FE6C27 </ color>. trong Giá trị / colors.xml của bạn.
mughil

4

Đây là mã để thay đổi màu của ProgressBar theo chương trình.

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

4
ProgressBar freeRamPb = findViewById(R.id.free_ram_progress_bar);

freeRamPb.getProgressDrawable().setColorFilter(
Color.BLUE, android.graphics.PorterDuff.Mode.SRC_IN);

Tuyệt vời. Giải pháp nhanh chóng và hiệu quả. Cảm ơn!
Tobias Reich
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.