Android RatingBar更改明星颜色

d-m*_*man 137 android rating

我怎样才能改变星星的颜色,我怎样才能改变星星的大小?

小智 119

在提到的博客上有点复杂,我使用了类似但更简单的方法.你需要3星图像(red_star_full.png,red_star_half.png和red_star_empty.png)和一个xml,这就是全部.

将这3张图片放在res/drawable上.

放下以下ratingbar_red.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" 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>
Run Code Online (Sandbox Code Playgroud)

最后,告诉你的ratingbar定义使用它,即

<RatingBar android:progressDrawable="@drawable/ratingbar_red"/>
Run Code Online (Sandbox Code Playgroud)

而已.

  • 嗨亚历克斯,我已经尝试过这个解决方案但是当我尝试将评级设置为1.1,1.2等等时......它显示为1.5.我拍了三张星图,一张是空的,一半是满的,一张是满的.我认为它应该在它们之间进行插值以获得小数分量,我只是想知道是否有其他人有同样的问题或我做了明显错误的事情? (3认同)

Mir*_*lak 90

试试这个,如果你只想改变颜色:

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

  • 不适用于API 5.0及更高版本.需要:```Drawable stars = rb.getProgressDrawable(); stars.setTint(Color.YELLOW); ``` (5认同)

小智 67

最简单的方法对我有用......如果你正在扩展AppCompat Activity

在build.gradle中添加最新的appcompat库.

dependencies {  
    compile 'com.android.support:appcompat-v7:X.X.X' // where X.X.X version
}
Run Code Online (Sandbox Code Playgroud)

使您的活动扩展android.support.v7.app.AppCompatActivity

public class MainActivity extends AppCompatActivity {  
    ...
}
Run Code Online (Sandbox Code Playgroud)

在styles.xml文件中声明自定义样式.

<style name="RatingBar" parent="Theme.AppCompat">  
    <item name="colorControlNormal">@color/indigo</item>
    <item name="colorControlActivated">@color/pink</item>
</style>  
Run Code Online (Sandbox Code Playgroud)

通过android:theme属性将此样式应用于RatingBar.

<RatingBar  
    android:theme="@style/RatingBar"
    android:rating="3"
    android:stepSize="0.5"
    android:numStars="5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Vishal Kumar.我在Kitkat 4.4.4(三星S3 neo)和Marshmallow 6.0.1(三星Galaxy On Nxt)上试过它,它有效.但是Lollipop 5.1(Micromax)没有成功.对于Lollipop,我在RatingBar中使用了"android:progressTint"属性,是的. (3认同)

lgv*_*lle 46

2015年更新

现在您可以使用DrawableCompat来着色所有类型的drawable.例如:

Drawable progress = ratingBar.getProgressDrawable();
DrawableCompat.setTint(progress, Color.WHITE);
Run Code Online (Sandbox Code Playgroud)

这与API 4向后兼容

  • 这将整个可绘制的颜色调整为一种颜色,这使得空星很难区分. (15认同)
  • 它绘制了5颗彩色星星,而不是3.5颗. (2认同)

Yur*_*dov 35

如果你想改变我使用的所有星星的颜色:

LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
stars.getDrawable(2).setColorFilter(getResources().getColor(R.color.starFullySelected), PorterDuff.Mode.SRC_ATOP);
stars.getDrawable(1).setColorFilter(getResources().getColor(R.color.starPartiallySelected), PorterDuff.Mode.SRC_ATOP);
stars.getDrawable(0).setColorFilter(getResources().getColor(R.color.starNotSelected), PorterDuff.Mode.SRC_ATOP);
Run Code Online (Sandbox Code Playgroud)

  • 你可以在这里找到答案http://stackoverflow.com/a/32202256/2513291例如这种方法ContextCompat.getColor(context,R.color.color_name) (2认同)

sup*_*cio 35

从API 21上可以很容易地用这三行代码改变星星的颜色:

android:progressTint="@android:color/holo_red_dark"
android:progressBackgroundTint="@android:color/holo_red_dark"
android:secondaryProgressTint="@android:color/holo_red_dark" 
Run Code Online (Sandbox Code Playgroud)

这样做,你将改变星星的背景颜色和边框颜色.

  • 如何改变空星的颜色? (3认同)

Com*_*are 26

步骤1:创建自己的样式,克隆一个现有样式(从$ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml),将它放在您自己的项目中styles.xml,并在将小部件添加到布局时引用它.

步骤#2:创建自己的LayerDrawableXML资源RatingBar,指向用于条形图的相应图像.原始样式将指向您可以与之比较的现有资源.然后,调整您的样式以使用您自己的LayerDrawable资源,而不是内置资源.

  • 使用android:progressTint ="@ color/yellow".请参阅@superpuccio的回答. (6认同)
  • progressTint仅支持21 api以上级别 (2认同)

dir*_*ill 25

Alex和CommonsWares发布的解决方案是正确的.Android从未谈到的一件事是不同密度的正确像素大小.以下是基于光晕的每种密度所需的尺寸.

小星星

mdpi: 16px
hdpi: 24px
xhdpi: 32px
xxhdpi: 48px
Run Code Online (Sandbox Code Playgroud)

中星

mdpi: 24px
hdpi: 36px
xhdpi: 48px
xxhdpi: 72px
Run Code Online (Sandbox Code Playgroud)

大明星

mdpi: 35px
hdpi: 52px
xhdpi: 69px
xxhdpi: 105px
Run Code Online (Sandbox Code Playgroud)


box*_*box 23

所以我一直在努力解决这个问题两个小时,我已经为所有API版本提出了一个可行的解决方案,其中还显示了半星评级.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您使用此drawables顺序调用该方法:

    LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
    // Filled stars
    setRatingStarColor(stars.getDrawable(2), ContextCompat.getColor(getContext(), R.color.foreground));
    // Half filled stars
    setRatingStarColor(stars.getDrawable(1), ContextCompat.getColor(getContext(), R.color.background));
    // Empty stars
    setRatingStarColor(stars.getDrawable(0), ContextCompat.getColor(getContext(), R.color.background));
Run Code Online (Sandbox Code Playgroud)

注意:您还必须在XML中指定属性"max"和"numStars",否则不会显示半星.

  • 工作完美. (3认同)

Dan*_*ar3 12

现在,您可以使用AppCompat v22.1.0以上的DrawableCompat动态着色所有类型的drawable,当您使用一组drawable支持多个主题时非常有用.例如:

LayerDrawable layerDrawable = (LayerDrawable) ratingBar.getProgressDrawable();
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)), Color.RED);   // Empty star
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)), Color.GREEN); // Partial star
DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)), Color.BLUE);  // Full star
Run Code Online (Sandbox Code Playgroud)

这是向下兼容到API 4.另请参阅Chris Banes关于支持库v22.1.0的博客文章

对于实际的大小和形状,您需要为适当的大小定义新的样式和图层列表drawable,正如其他人已经在上面回答的那样.


hid*_*dro 10

使用android:theme属性:

styles.xml

<style name="Theme.Rating" parent="Theme.AppCompat.Light">
    <item name="colorAccent">@color/rating</item>
</style>
Run Code Online (Sandbox Code Playgroud)

layout.xml

<android.support.v7.widget.AppCompatRatingBar
    android:theme="@style/Theme.Rating"
    android:numStars="5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)


Rah*_*hul 9

只需从xml更改评级栏的颜色: -

android:progressTint="@color/your_color"
android:backgroundTint="@color/your_color"
android:secondaryProgressTint="@color/your_color"
Run Code Online (Sandbox Code Playgroud)


小智 7

要更改您只需要设置的颜色,请设置参数android:progressTint

 <RatingBar
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginTop="15dp"
        android:numStars="5"
        android:rating="1"
        android:progressTint="@android:/color/black"
        android:layout_gravity="center"
       />
Run Code Online (Sandbox Code Playgroud)

对于样式属性的大小.


4nd*_*o1d 5

在不添加新样式的情况下,您可以在 RatingBar

             <RatingBar
                    android:id="@+id/ratingBar"
                    style="@android:style/Widget.Holo.RatingBar.Small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:numStars="5"
                    android:rating="4.5"
                    android:stepSize="0.5"
                    android:progressTint="@color/colorPrimary"/>
Run Code Online (Sandbox Code Playgroud)


Meh*_*tab 5

最简单的方法:

android:progressTint="@color/color"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于 api 21+ (2认同)