Có 3 cách để giải quyết câu hỏi này:
- Cách điều chỉnh màu thanh tiến trình khai báo
- Cách điều chỉnh màu của thanh tiến trình theo chương trình, nhưng chọn màu từ các màu được xác định trước khác nhau được khai báo trước thời gian biên dịch
- Cách điều chỉnh màu của thanh tiến trình theo chương trình, và cũng tạo màu theo chương trình.
Đặc biệt, có rất nhiều nhầm lẫn xung quanh # 2 và # 3, như đã thấy trong các bình luận cho câu trả lời của amfcosta. Câu trả lời đó sẽ mang lại kết quả màu sắc không thể đoán trước bất cứ lúc nào bạn muốn đặt thanh tiến trình thành bất cứ thứ gì ngoại trừ màu chính, vì nó chỉ sửa đổi màu nền và khu vực "clip" của thanh tiến trình thực tế vẫn sẽ là lớp phủ màu vàng với độ mờ giảm. Ví dụ: sử dụng phương pháp đó để đặt nền thành màu tím đậm sẽ dẫn đến màu "clip" của thanh tiến trình có màu hồng nhạt điên rồ do trộn màu tím đậm và màu vàng thông qua việc giảm alpha.
Vì vậy, dù sao đi nữa, # 1 được trả lời hoàn hảo bởi Ryan và Štarke trả lời hầu hết số 3, nhưng đối với những người tìm kiếm một giải pháp hoàn chỉnh cho # 2 và # 3:
Cách điều chỉnh màu của thanh tiến trình theo chương trình, nhưng chọn màu từ màu được xác định trước được khai báo trong XML
res / drawable / my_proTHERbar.xml :
Tạo tệp này nhưng thay đổi màu sắc trong my_proTHER và my_secondsProTHER:
(LƯU Ý: Đây chỉ là một bản sao của tệp XML thực tế xác định SDK ProgressBar mặc định của Android, nhưng tôi đã thay đổi ID và Màu sắc. Bản gốc có tên là 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>
Trong Java của bạn :
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)
Cách điều chỉnh màu của thanh tiến trình theo chương trình và cũng tạo màu theo chương trình
EDIT: Tôi tìm thấy thời gian để giải quyết điều này đúng. Câu trả lời trước đây của tôi để lại điều này một chút mơ hồ.
Một ProgressBar được cấu thành như 3 Drawables trong LayerDrawable.
- Lớp 1 là nền
- Lớp 2 là màu tiến trình thứ cấp
- Lớp 3 là màu thanh tiến trình chính
Trong ví dụ dưới đây, tôi sẽ thay đổi màu của thanh tiến trình chính thành màu lục lam.
//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);
Ví dụ đó đặt nó thành một màu đơn sắc. Bạn có thể đặt nó thành màu gradient bằng cách thay thế
shpDrawable.getPaint().setColor(Color.CYAN);
với
Shader shader = new LinearGradient(0, 0, 0, progressBar.getHeight(), Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP);
shpDrawable.getPaint().setShader(shader);
Chúc mừng.
-Cây thương