Android自定义RatingBar:激活图标颜色修改异常求助
解决RatingBar激活状态颜色设置的问题
嘿,我来帮你搞定这个RatingBar的颜色问题!你遇到的两个问题其实都有明确的原因,咱们一步步来解决:
为什么第一个方案会出现绿色阴影/错位图标?
你用android:progressTint把激活星星改成黄色是对的,但AppCompat的RatingBar默认是由三层drawable组成的:背景层(未激活星星)、二级进度层(半激活/过渡层)、进度层(激活星星)。你只设置了进度层的颜色,二级进度层还是默认的绿色,所以就出现了残留的绿色阴影/错位效果。
为什么第二个方案完全没效果?
android:colorControlNormal和android:colorControlActivated是给CheckBox、RadioButton这类开关型控件用的属性,对RatingBar完全不生效,所以自然看不到变化啦。
正确的解决方案
方案1:通过Tint属性快速修复(无需自定义图标)
直接同时设置所有相关层的tint颜色,注意要用AppCompat的命名空间属性(app:前缀,而不是android:),这样能适配更多版本:
<style name="CustomRatingBar" parent="Widget.AppCompat.RatingBar"> <!-- 激活状态星星的颜色 --> <item name="app:progressTint">@color/myYellow</item> <!-- 过渡/半激活层的颜色(和激活色一致就不会有阴影) --> <item name="app:secondaryProgressTint">@color/myYellow</item> <!-- 未激活状态星星的颜色 --> <item name="app:progressBackgroundTint">@color/yourUnactivatedColor</item> </style>
然后在布局里给RatingBar应用这个样式:
<androidx.appcompat.widget.AppCompatRatingBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/CustomRatingBar" android:numStars="5" android:rating="3" />
方案2:自定义Drawable彻底控制(适合需要自定义星星图标)
如果想要完全自定义星星的样式,比如用自己的图标,可以创建一个layer-list drawable文件(比如res/drawable/custom_rating_bar.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/ic_star_unfilled" /> <!-- 过渡层(不需要特殊效果就和背景层一致) --> <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/ic_star_unfilled" /> <!-- 激活的星星 --> <item android:id="@android:id/progress" android:drawable="@drawable/ic_star_filled" /> </layer-list>
然后在样式里引用这个drawable并设置tint:
<style name="CustomRatingBar" parent="Widget.AppCompat.RatingBar"> <item name="android:progressDrawable">@drawable/custom_rating_bar</item> <item name="app:progressTint">@color/myYellow</item> <item name="app:progressBackgroundTint">@color/grey</item> </style>
这样就能彻底解决残留颜色的问题,完美实现你想要的激活/未激活星星颜色区分啦!
内容的提问来源于stack exchange,提问作者user8434434
相关产品推荐
相关产品推荐

