所以我创建了一个带有新图标的评级栏,但是,当我实现它时,星星看起来像是在流血,请参阅附件:
以下是样式,评级xml以及它们在布局中的实现方式:
式:
<style name="GoldRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">@drawable/gold_ratingbar</item>
<item name="android:indeterminateDrawable">@drawable/gold_ratingbar</item>
<item name="android:thumb">@null</item>
<item name="android:isIndicator">true</item>
</style>
评级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/rating_star_icon_off" />
<item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/rating_star_icon_half" />
<item android:id="@+android:id/progress" android:drawable="@drawable/rating_star_icon" />
</layer-list>
布局:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="Overall rating"
android:textSize="16sp"
android:textStyle="bold" />
<RatingBar
android:id="@+id/review_overall_rating"
style="@style/GoldRatingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="6dp"
android:layout_marginLeft="6dp"
android:rating="3" />
<TextView
android:id="@+id/review_rating_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text=""
android:textStyle="bold" />
谁能看到我哪里出错?
答案 0 :(得分:21)
答案 1 :(得分:4)
我遇到了同样的问题。
在我的情况下,blank_star.png
身高为17dp,因此我将android:layout_height="17dp"
放在RatingBar
上,我的问题就解决了。请尝试以下代码: -
<RatingBar
android:id="@+id/rating"
style="@style/rating_bar"
android:layout_width="wrap_content"
android:layout_height="17dp"
android:layout_marginRight="5dp"
android:isIndicator="true"
android:numStars="5"
android:stepSize="1.0" />
<强>风格/ rating_bar.xml 强>
<style name="rating_bar" parent="@android:style/Widget.RatingBar">
<item name="android:progressDrawable">@drawable/rating_bar_full</item>
<item name="android:minHeight">18dip</item>
<item name="android:maxHeight">18dip</item>
</style>
<强>抽拉/ rating_bar_full 强>
<?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/ratingbar_full_empty"/>
<item
android:id="@+android:id/secondaryProgress"
android:drawable="@drawable/ratingbar_full_empty"/>
<item
android:id="@+android:id/progress"
android:drawable="@drawable/ratingbar_full_filled"/>
</layer-list>
<强>抽拉/ ratingbar_full_empty 强>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/blank_star" android:state_pressed="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/blank_star" android:state_focused="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/blank_star" android:state_selected="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/blank_star"/>
</selector>
<强>抽拉/ ratingbar_full_filled.xml 强>
<item android:drawable="@drawable/filled_star" android:state_pressed="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/filled_star" android:state_focused="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/filled_star" android:state_selected="true" android:state_window_focused="true"/>
<item android:drawable="@drawable/filled_star"/>
答案 2 :(得分:2)
对于所有仍在寻找答案但又不想裁剪图像的人:android:minHeight="0dp"
帮助了我
答案 3 :(得分:1)
出现渗色是因为重复了星形图像的最后一行。你可以通过设置RatingBar的大小来完全匹配底层drawable来解决这个问题。
RatingBar从不检查底层drawable的大小。所以你必须自己做。使用xml可能很难做到这一点,因为对于不同的屏幕密度,您的资产可能具有不同的大小。此外,您的UX用户可能会更改资产而不更新xml维度。
解决方案:创建一个RatingBar,用于检查其drawable的大小。见下文
public class RatingBar extends android.widget.RatingBar {
private Drawable starDrawable;
public RatingBar(Context context) {
this(context, null);
}
public RatingBar(Context context, AttributeSet attrs) {
super(context, attrs);
starDrawable = getResources().getDrawable(
R.drawable.your_drawable, context.getTheme());
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Make sure to account for padding and margin, if you care.
// I only cared about left padding.
setMeasuredDimension(starDrawable.getIntrinsicWidth() * 5
+ getPaddingLeft(), starDrawable.getIntrinsicHeight());
}
}