我如何更改星星的颜色和大小?
我如何更改星星的颜色和大小?
在所提到的博客中,有点复杂,我使用了一种类似但更简单的方法。 你需要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>
最后,告诉你的 RatingBar 定义使用它,即:
<RatingBar android:progressDrawable="@drawable/ratingbar_red"/>
就是这样。
如果您只想更改颜色,请尝试以下方法:
RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar);
LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
stars.getDrawable(2).setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP);
PorterDuff.Mode.SRC_ATOP
究竟是什么意思或作用? - Zapnologicastars.setTint(Color.YELLOW);```
- zyamys我觉得最容易的方法是...如果你要扩展AppCompat Activity
在你的build.gradle中添加最新的appcompat库。
dependencies {
compile 'com.android.support:appcompat-v7:X.X.X' // where X.X.X version
}
将您的活动扩展为android.support.v7.app.AppCompatActivity
public class MainActivity extends AppCompatActivity {
...
}
在styles.xml文件中声明自定义样式。
<style name="RatingBar" parent="Theme.AppCompat">
<item name="colorControlNormal">@color/indigo</item>
<item name="colorControlActivated">@color/pink</item>
</style>
通过 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"/>
style="?android:ratingBarStyleSmall"
。 - André Luiz Reis<style name="RatingBarSmallTheme" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/colorOrangeNormal</item> <item name="colorControlActivated">@color/colorOrangeActivated</item> <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar.Small</item> </style>
以及你的评分条android:theme="@style/RatingBarSmallTheme"
- Zakhar Rodionov从API 21开始,只需使用以下三行代码即可轻松更改星级的颜色:
android:progressTint="@android:color/holo_red_dark"
android:progressBackgroundTint="@android:color/holo_red_dark"
android:secondaryProgressTint="@android:color/holo_red_dark"
按照以下方式操作,您将更改:
2015年更新
现在你可以使用DrawableCompat来给各种drawable上色。例如:
Drawable progress = ratingBar.getProgressDrawable();
DrawableCompat.setTint(progress, Color.WHITE);
这是向后兼容的,支持 API 4 及更早版本。
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {}
中,因为它默认从API 22开始工作。 - Yoann Hercouet如果你想改变所有星形状态的颜色,可以使用以下方法:
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);
步骤#1:创建自己的样式,通过克隆现有样式(从$ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml
)并将其放在自己项目的styles.xml
中,在将小部件添加到布局时引用它。
步骤#2:为RatingBar
创建自己的LayerDrawable
XML资源,指向适合用于该栏的图片。原始样式将指向您可以与之比较的现有资源。然后,调整您的样式以使用您自己的LayerDrawable
资源,而不是内置资源。
所以我已经为这个问题苦苦挣扎了两个小时,最终想出了一个适用于所有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);
}
}
您按照以下绘制可绘制对象的顺序调用此方法:
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));
注意:您还必须在XML中指定"max"和 "numStars" 属性,否则将不会显示半星。
Mode.SRC_IN
还是 Mode.MULTIPLY
? - Dr.jackyAlex和CommonsWares发布的解决方案是正确的。但Android从未谈论过不同密度的正确像素大小。以下是每个密度所需的尺寸,根据光晕灯。
小星星
mdpi: 16px
hdpi: 24px
xhdpi: 32px
xxhdpi: 48px
中等的星星
mdpi: 24px
hdpi: 36px
xhdpi: 48px
xxhdpi: 72px
大星星
mdpi: 35px
hdpi: 52px
xhdpi: 69px
xxhdpi: 105px
现在,从AppCompat v22.1.0开始,您可以使用DrawableCompat动态着色各种可绘制对象,这在支持多个主题的单个可绘制对象集时非常有用。例如:
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
这是向后兼容的,可以向下兼容到API 4。此外,请参阅Chris Banes关于Support Libraries v22.1.0的博客文章。
对于实际的大小和形状,您需要为适当的大小定义一个新的样式和层列表可绘制对象,就像其他人已经在上面回答的那样。