Android: 如何将评分条的颜色更改为金色

69

我希望将评分栏的颜色更改为金色。
我不想自定义星星,只想更改API 16或以上版本的颜色
我尝试了以下解决方案,但没有一个适用于我。

1.    

RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar);
LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
stars.getDrawable(2).setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP);

2.

android:progressDrawable="@color/golden" in XML
14个回答

170

现在,这个选项已经包含在AppCompat库中。自动使用RatingBar的AppCompat版本。

http://developer.android.com/reference/android/support/v7/widget/AppCompatRatingBar.html

例如(来自我的应用程序):

<RatingBar
    android:id="@+id/rating"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:numStars="5"
    android:stepSize="1"
    android:theme="@style/RatingBar"/>

主题为:

<style name="RatingBar" parent="Theme.AppCompat">
    <item name="colorControlNormal">@color/lightGrey</item>
    <item name="colorControlActivated">@color/duskYellow</item>
</style>

5
除了以上回答外,您可以在评级条部件中使用style="@style/Base.Widget.AppCompat.RatingBar.Small"或@style/Base.Widget.AppCompat.RatingBar.Indicator来调整评级星的颜色和大小。请注意,这不会改变原来的意思。 - sissyphus_69
1
有没有编程的方式可以做到这一点?我需要在运行时更改星星的颜色。 - Євген Гарастович
3
没关系。在这里找到了一个很棒的库:https://github.com/FlyingPumba/SimpleRatingBar 我们应该给这个人一个奖牌。可定制性超强。 - Євген Гарастович
@Malder,你需要从colorControlActivated中删除android:。因为我使用了自动完成代码,所以添加了android:前缀。没有这个前缀,它也可以在KitKat上工作。 - M.kazem Akhgary
评分条有三种颜色,你错过的是当选择0星时的颜色。我还不知道那个键是什么。 - Cyph3rCod3r

64

在API 21及更高版本中,您可以使用以下方式更改填充星形的颜色:

     android:progressTint="@color/color"

并且描边的颜色为

     android:progressBackgroundTint="@color/color"

在我设置的颜色后面,我还能看到一点旧颜色,但在我的情况下,那是黑色并且看起来像阴影。感谢这个快速而伟大的解决方案! - Panther

16

根据您提到的,您希望在不使用drawable的情况下更改星星的颜色。您可以按照以下几行代码完成:

RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar);
Drawable drawable = ratingBar.getProgressDrawable();
drawable.setColorFilter(Color.parseColor("#0064A8"),PorterDuff.Mode.SRC_ATOP);

8
例如,它会画出5个彩色的星星,而不是3.5个。 - CoolMind

12

我的任务是将Android>=14 SDK的评分栏颜色更改为应用程序的主要颜色。只有在代码和xml文件中进行的更改才能帮助我。

 mRatingBar = (RatingBar)view.findViewById(R.id.ratingBar);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        try {
            Drawable progressDrawable = mRatingBar.getProgressDrawable();
            if (progressDrawable != null) {
                DrawableCompat.setTint(progressDrawable, ContextCompat.getColor(getContext(), R.color.colorPrimary));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在 XML 文件中

        <RatingBar
            android:id="@+id/ratingBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:backgroundTint="@color/colorPrimary"
            android:numStars="5"
            android:progressTint="@color/colorPrimary"
            android:rating="0"
            android:secondaryProgressTint="@android:color/transparent"
            android:stepSize="1" />

8

我的使用场景是展示不同等级的颜色。例如:

1- 红色
2- 橙色
3- 黄色
4- 浅绿色
5- 深绿色


解决方案:

ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {

  @Override
  public void onRatingChanged(final RatingBar ratingBar, final float rating, final boolean fromUser) {
      setCurrentRating(rating);
    }
});

然后在你的setCurrentRating()方法中:

 private void setCurrentRating(float rating) {
    LayerDrawable drawable = (LayerDrawable)rateOverall.getProgressDrawable();
    if(mContext!=null) {
          switch (Math.round(rating)) {
            case 1:
              setRatingStarColor(drawable.getDrawable(2), ContextCompat.getColor(mContext, R.color.dark_red));
              break;
            case 2:
              setRatingStarColor(drawable.getDrawable(2), ContextCompat.getColor(mContext, R.color.light_orange));
              break;
            case 3:
              setRatingStarColor(drawable.getDrawable(2), ContextCompat.getColor(mContext, R.color.light_yellow));
              break;
            case 4:
              setRatingStarColor(drawable.getDrawable(2), ContextCompat.getColor(mContext, R.color.light_green_review));
              break;
            case 5:
              setRatingStarColor(drawable.getDrawable(2), ContextCompat.getColor(mContext, R.color.dark_green));
              break;
          }
      setRatingStarColor(drawable.getDrawable(1), ContextCompat.getColor(mContext, R.color.transparent));
      setRatingStarColor(drawable.getDrawable(0), ContextCompat.getColor(mContext, R.color.light_grey_payment));

    }
  }

然后在你的setRatingStarColor()方法中:

   private void setRatingStarColor(Drawable drawable, @ColorInt int color)
  {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
      DrawableCompat.setTint(drawable, color);
    }
    else
    {
      drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
  }

感谢这篇回答,它帮助我解决了问题。希望它能帮到其他人!

有用的答案 (y) - InsaneCat

6

来自 XML

android:progressTint="#ffff8800"

编程方式实现:

Drawable drawableReview = bar.getProgressDrawable();
drawableReview.setColorFilter(Color.parseColor("#ffff8800"), 
PorterDuff.Mode.SRC_ATOP);

4

试试这个:

你需要3张星形图片 (red_star_full.png、red_star_half.png 和 red_star_empty.png) 以及一个 xml 文件。如果你想要金色的星星,那么使用金色的星形图片。这是针对红色星星的。

你可以把 ratingbar_color.xml 放在 res/drawable 目录下。

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background" android:drawable="@drawable/red_star_empty" />
    <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/red_star_half" />
    <item android:id="@android:id/progress" android:drawable="@drawable/red_star_full" />
</layer-list>

在评分栏的定义中,请使用以下内容。
<RatingBar android:progressDrawable="@drawable/ratingbar_red/>

3
以下是翻译的结果:原文链接:https://dev59.com/tnE95IYBdhLWcg3wHqSl#6008722如何更改Android RatingBar中星星的颜色?我想要将默认的黄色星星更改为其他颜色,有没有简单的方法可以实现? - turbandroid

2

简单的解决方法,使用AppCompatRatingBar并使用以下代码:

ratingbar.setProgressTintList(ColorStateList.valueOf(ContextCompat.getColor(context, R.color.colorAccent)));

2
RatingBar ratingreview; 
ratingreview=(RatingBar)v.findViewById(R.id.ratingreview); 
ratingreview.setRating(Float.parseFloat(objrating)); 
Drawable drawable = ratingreview.getProgressDrawable(); 
drawable.setColorFilter(Color.parseColor("#6A9A28"), PorterDuff.Mode.SRC_ATOP);

2
评分条颜色和大小的更改:

<RatingBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:numStars="5"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="5dp"
    style = "?android:attr/ratingBarStyleIndicator"
    android:progressTint="#ffff8800"
    android:rating="3.5"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:theme="@style/RatingBar" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接