如何在 Android 中改变 ProgressBar 进度指示器的颜色

我设置了水平ProgressBar

我想把进度的颜色改为黄色。


问题是,进度的颜色在不同的设备上是不同的。 因此,我想让它修复进度颜色

241205 次浏览

我从我的一个应用中复制了这个,所以有一些额外的属性,但应该给你一个想法。这是来自有进度条的布局:

<ProgressBar
android:id="@+id/ProgressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:maxHeight="10dip"
android:minHeight="10dip"
android:progress="50"
android:progressDrawable="@drawable/greenprogress" />

然后用类似于下面的内容创建一个新的可绘制对象(在本例中是greenprogress.xml):

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:angle="270"
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:startColor="#ff9d9e9d" />
</shape>
</item>


<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:angle="270"
android:centerColor="#80ffb600"
android:centerY="0.75"
android:endColor="#a0ffcb00"
android:startColor="#80ffd300" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:angle="270"
android:endColor="#008000"
android:startColor="#33FF33" />
</shape>
</clip>
</item>


</layer-list>

你可以根据需要改变颜色,这将给你一个绿色的进度条。

一个更简单的解决方案:

progess_drawable_blue

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid
android:color="@color/disabled" />
</shape>
</item>


<item
android:id="@android:id/progress">
<clip>
<shape>
<solid
android:color="@color/blue" />
</shape>
</clip>
</item>


</layer-list>

我找到的最简单的解决方法是这样的:

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

将上述文件放在res > values文件夹下的styles.xml文件中。

注意:如果你使用任何其他强调色,那么前面的解决方案应该很好。

API 21或更高

如果你只想改变进度条的颜色,你可以简单地在Activity的onCreate()方法中使用一个颜色过滤器:

ProgressBar progressbar = (ProgressBar) findViewById(R.id.progressbar);
int color = 0xFF00FF00;
progressbar.getIndeterminateDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
progressbar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);

来自在这里的想法。

你只需要为棒棒糖之前的版本这样做。在棒棒糖上,你可以使用colorAccent样式属性。

对于任何寻找如何以编程方式完成它的人:

    Drawable bckgrndDr = new ColorDrawable(Color.RED);
Drawable secProgressDr = new ColorDrawable(Color.GRAY);
Drawable progressDr = new ScaleDrawable(new ColorDrawable(Color.BLUE), Gravity.LEFT, 1, -1);
LayerDrawable resultDr = new LayerDrawable(new Drawable[] { bckgrndDr, secProgressDr, progressDr });
//setting ids is important
resultDr.setId(0, android.R.id.background);
resultDr.setId(1, android.R.id.secondaryProgress);
resultDr.setId(2, android.R.id.progress);

为可绘制对象设置id是至关重要的,它可以保护进度条的边界和实际状态

有3种方法可以解决这个问题:

  1. 如何调整进度条的颜色声明
  2. 如何以编程方式调整进度条的颜色,但选择从各种预先确定的颜色在编译时之前声明的颜色
  3. 如何以编程方式调整进度条颜色,以及以编程方式创建颜色。

特别是,从amfcosta的回答的评论中可以看出,关于第2和第3条有很多困惑。当你想将进度条设置为除原色以外的任何颜色时,这个答案将产生不可预测的颜色结果,因为它只修改背景色,而实际的进度条“剪贴”;区域将仍然是一个黄色的覆盖减少不透明度。例如,使用该方法将背景设置为深紫色将导致进度条“剪贴”;一些疯狂的粉红色的颜色,由暗紫色和黄色混合通过减少alpha。

所以不管怎样,第一条由Ryan完美地回答了,Štarke回答了第三条的大部分问题,但对于那些寻找第二条和第三条完整解决方案的人来说:


如何以编程方式调整进度条的颜色,但从XML中声明的预定颜色中选择颜色

res /可拉的/ my_progressbar.xml:

创建这个文件,但是改变my_progress和my_secondsProgress的颜色:

(注:这只是定义默认android SDK ProgressBar的实际XML文件的副本,但我已经改变了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由LayerDrawable中的3个Drawables组成。

  1. 第一层是背景
  2. 第2层是次要的进度颜色
  3. 图层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);

欢呼。

兰斯

final LayerDrawable layers = (LayerDrawable) progressBar.getProgressDrawable();
layers.getDrawable(2).setColorFilter(color,PorterDuff.Mode.SRC_IN);
你们真让我头疼。 你可以做的是首先通过XML绘制图层列表(意味着一个背景作为第一层,一个表示次要进度的可绘制对象作为第二层,另一个表示主要进度的可绘制对象作为最后一层),然后通过执行以下操作更改代码上的颜色:

public void setPrimaryProgressColor(int colorInstance) {
if (progressBar.getProgressDrawable() instanceof LayerDrawable) {
Log.d(mLogTag, "Drawable is a layer drawable");
LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable();
Drawable circleDrawableExample = layered.getDrawable(<whichever is your index of android.R.id.progress>);
circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN);
progressBar.setProgressDrawable(layered);
} else {
Log.d(mLogTag, "Fallback in case it's not a LayerDrawable");
progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
}
}

这种方法将为您提供最好的灵活性,让您在xml上声明原始绘图的测量,而无需修改其结构,特别是如果您需要特定的xml文件屏幕文件夹,那么只需通过代码修改COLOR。没有重新实例化一个新的ShapeDrawable从零开始。

ProgressBar的颜色可以这样改变:

/ / colors.xml res /值

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorAccent">#FF4081</color>
</resources>

/ / styles.xml res /值

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

onCreate:

progressBar = (ProgressBar) findViewById(R.id.progressBar);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
Drawable drawable = progressBar.getIndeterminateDrawable().mutate();
drawable.setColorFilter(ContextCompat.getColor(this, R.color.colorAccent), PorterDuff.Mode.SRC_IN);
progressBar.setIndeterminateDrawable(drawable);
}

适用于API等级21或更高

android:progressBackgroundTint="@color/yourBackgroundColor"
android:progressTint="@color/yourColor"

只需在values/styles.xml中创建一个样式。

<style name="ProgressBarStyle">
<item name="colorAccent">@color/greenLight</item>
</style>

然后将此样式设置为ProgressBar主题。

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

,不管你的进度条是水平的还是圆形的。 就是这样。< / p >

如果你在API级别21或以上,你可以使用这些XML属性:

<!-- For indeterminate progress bar -->
android:indeterminateTint="@color/white"
<!-- For normal progress bar -->
android:progressTint="@color/white"

创建一个可绘制资源什么背景你需要,在我的情况下,我命名为bg_custom_progressbar.xml

<?xml version="1.0" encoding="utf-8"?>

<item>
<shape android:shape="rectangle" >
<corners android:radius="5dp"/>


<gradient
android:angle="180"
android:endColor="#DADFD6"
android:startColor="#AEB9A3" />
</shape>
</item>
<item>
<clip>
<shape android:shape="rectangle" >
<corners android:radius="5dp" />


<gradient
android:angle="180"
android:endColor="#44CF4A"
android:startColor="#2BB930" />
</shape>
</clip>
</item>
<item>
<clip>
<shape android:shape="rectangle" >
<corners android:radius="5dp" />


<gradient
android:angle="180"
android:endColor="#44CF4A"
android:startColor="#2BB930" />
</shape>
</clip>
</item>

然后使用这个自定义背景像

 <ProgressBar
android:id="@+id/progressBarBarMenuHome"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="6dp"
android:indeterminate="false"
android:max="100"
android:minWidth="200dp"
android:minHeight="50dp"
android:progress="10"
android:progressDrawable="@drawable/bg_custom_progressbar" />

它对我很有效

在xml:

<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleInverse"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="@dimen/dimen_10dp"




android:indeterminateTint="@{viewModel.getComplainStatusUpdate(position)}"
android:indeterminate="true"
android:indeterminateOnly="false"
android:max="100"
android:clickable="false"
android:indeterminateDrawable="@drawable/round_progress"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />

视图模型:

fun getComplainStatusUpdate(position: Int):Int{


val list = myAllComplainList!!.getValue()
if (list!!.get(position).complainStatus.equals("P")) {
//  progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
// progressBar.setBackgroundResource(R.drawable.circle_shape)
return Color.RED
} else if (list!!.get(position).complainStatus.equals("I")) {


return Color.GREEN
} else {


return Color.GREEN
}




return Color.CYAN
}

在材质组件库中,你可以使用带有app:indicatorColor属性的LinearProgressIndicator来改变颜色:

  <com.google.android.material.progressindicator.LinearProgressIndicator
app:indicatorColor="@color/..."
app:trackThickness="..."
app:trackColor="@color/..."
/>

enter image description here

请注意:它至少需要1.3.0-alpha04版本。

ProgressBar中,你可以使用以下方法覆盖颜色:

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

:

<style name="CustomProgressBarTheme">
<item name="colorAccent">@color/primaryDarkColor</item>
</style>

enter image description here

如果你想在android中以编程方式设置主要和次要进度颜色为水平进度条,请使用下面的代码片段

int[][] states = new int[][] {
new int[] {-android.R.attr.state_checked},
new int[] {android.R.attr.state_checked},
};


int[] secondaryColor = new int[] {
context.getResources().getColor(R.color.graph_line_one),
Color.RED,
};


int[] primaryColor = new int[] {
context.getResources().getColor(R.color.middle_progress),
Color.BLUE,
};
progressbar.setProgressTintList(new ColorStateList(states, primaryColor));
progressbar.setSecondaryProgressTintList(new ColorStateList(states, secondaryColor));

您可以使用自定义绘图使您的Progressbar可设置样式。创建一个可绘制文件

progress_user_badge.xml

<?xml version="1.0" encoding="utf-8"?>


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


<item android:id="@android:id/background">
<shape android:shape="rectangle">
<corners android:radius="@dimen/_5sdp"/>
<solid android:color="@color/your_default_color" />
</shape>
</item>


<item android:id="@android:id/progress">
<clip>
<shape android:shape="rectangle">
<corners android:radius="@dimen/_5sdp"/>
<solid android:color="@color/your_exact_color" />
</shape>
</clip>
</item>


</layer-list>

现在在小部件中使用这个可绘制文件

<ProgressBar
android:id="@+id/badge_progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="@dimen/_200sdp"
android:layout_height="@dimen/_7sdp"
android:layout_gravity="center"
android:layout_marginTop="@dimen/_15sdp"
android:indeterminate="false"
android:max="100"
android:progress="70"
android:progressDrawable="@drawable/progress_user_badge"/>

您可以使用下面的线条以编程方式更改Progressbar的进度颜色

badge_progress_bar.progressTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.your_color))

简单地添加android:indeterminateTint="@color/colorPrimary"到你的progressBar

例子:

<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateTint="@color/colorPrimary"/>

如果progressBarStyleHorizontal改变android:progressTint="@color/colorPrimary"

例子:

 <ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:progress="50"
android:progressTint="@color/colorPrimary" />
< p >添加 android: indeterminateTint =“@color / red"(你的颜色)在你的ProgressBar