如何设置RatingBar中星星的自定义大小

32

我已经添加了一个样式

<style name="myRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:minHeight">32dp</item>
    <item name="android:maxHeight">32dp</item>
</style>

但是我收到的却是裁切过的星星而非缩放后的星星:

enter image description here

有没有办法改变星星的大小?


你可以在 <RatingBar> 标签中简单地添加 android:minHeight="32dp" - CoolMind
11个回答

35

另一种方法是对小部件进行缩放:

android:scaleX="0.5"
android:scaleY="0.5"

2
(注意)这个解决方案看起来不错,但是有一个缺点。它不会改变实际的触摸区域,因此在用户评分时可能不太自然。 - Doongsil

22

Android不会按比例缩放评级栏图标。当你减小minHeightmaxHeight时,Android会总是像图片上显示的那样裁剪图标。解决这个问题唯一的方法似乎是提供具有所需尺寸的星形图标并将minHeightmaxHeight设置为图标的大小。


2
如果您的应用程序的不同部分需要不同大小的星星怎么办?您需要为此新资源吗?那么,如何支持不同的平板尺寸呢?我现在需要支持8组星星?图像应该按比例缩放到视图中,就像ImageView一样,而不是反过来。 - Greg Ennis
我知道这个问题已经很久了,但我有一个相关的问题,确切地说是标准星形图标 @android:style/Widget.RatingBar 和小星形样式 "?android:attr/ratingBarStyleSmall" 的大小是多少。你知道这些图标存放在哪里吗? - Tafari
1
我创建了一个方法,您可以为RatingBar设置自己的图像,并为星形图标设置自定义颜色叠加。通过一些修改,您可以设置自定义大小和高度,而不会对实际布局大小产生任何异常,每个星级评分的填充也可以进行修改。 - box

8

//您也可以尝试以下方法

<style name="myRatingBar" parent="@android:style/Widget.RatingBar.Indicator">

<style name="myRatingBar" parent="@android:style/Widget.RatingBar.Small">

参考: /android-sdk/platforms/android-10/data/res/values/styles.xml

这段文字提到了一个路径,指向安卓平台的样式文件。
<style name="Widget.RatingBar">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@android:drawable/ratingbar_full</item>
        <item name="android:indeterminateDrawable">@android:drawable/ratingbar_full</item>
        <item name="android:minHeight">57dip</item>
        <item name="android:maxHeight">57dip</item>
        <item name="android:thumb">@null</item>
    </style>

    <style name="Widget.RatingBar.Indicator">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@android:drawable/ratingbar</item>
        <item name="android:indeterminateDrawable">@android:drawable/ratingbar</item>
        <item name="android:minHeight">38dip</item>
        <item name="android:maxHeight">38dip</item>
        <item name="android:thumb">@null</item>
        <item name="android:isIndicator">true</item>
    </style>

    <style name="Widget.RatingBar.Small">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@android:drawable/ratingbar_small</item>
        <item name="android:indeterminateDrawable">@android:drawable/ratingbar_small</item>
        <item name="android:minHeight">14dip</item>
        <item name="android:maxHeight">14dip</item>
        <item name="android:thumb">@null</item>
        <item name="android:isIndicator">true</item>
    </style>

好的。每当我将minHeight和maxHeight更改为较小的值时,我会收到如附图所示的星星。似乎图片没有按比例缩放,我必须通过提供所需大小的自定义图标来自定义评分栏。 - Marcin S.

5

也许我们可以使用 Android 提供的另一种替代方案,即使用小尺寸评分星级。 将样式添加为"@style/Widget.AppCompat.RatingBar.Small"到 RatingBar 中。

            <RatingBar
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/list_item_margin"
                android:layout_marginLeft="@dimen/list_item_margin"
                android:numStars="5"
                android:isIndicator="true"
                style="@style/Widget.AppCompat.RatingBar.Small"/>

5
你解决了你的问题。但这可能对其他人有所帮助。
我也遇到了同样的问题。所有我得到的解决方案都不能适用于多个屏幕尺寸。经过数小时的努力,我最终找到了以下解决方案。
只需在运行时获取您想要使用的可绘制高度,并将其设置为RatingBar即可。以下是示例代码。
Drawable starDrawable = getResources().getDrawable(R.drawable.YOUR_IMAGE);
int height = starDrawable.getMinimumHeight();
LayoutParams params = (LayoutParams) ratingBar.getLayoutParams();
params.height = height;
ratingBar.setLayoutParams(params);

谢谢兄弟,最佳解决方案 ;) - Levon Petrosyan
@Ketan Ahir和Swayam,width是什么意思?我有一个非常小的自定义drawable,我想让它适合屏幕,请问有人知道答案吗?请告诉我。 - Sarthak Dhami
你知道我怎样通过编程设置每个星星的大小或者说,比如从五颗星星中的第三颗星星的大小吗? - Jono

2

看这个使用Android的小型样式自定义评分栏。

我认为您需要使用自定义样式来制作评分栏。这里是示例。


字体太小了,我该如何设置默认星号的不同大小? - Marcin S.
@MarcinS。我添加了另一个链接。 - Chirag

2
             <RatingBar
                android:id="@+id/AVL_rating"
                style="?android:attr/ratingBarStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ASD_cardlayout"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:layout_marginTop="@dimen/_10sdp"
                android:isIndicator="true"
                android:numStars="5"
                android:rating="5.0"
                android:secondaryProgressTint="@color/clr_red"
                android:stepSize="1.0" />

1
你可以在RatingBar的XML代码中设置它,使用scaleX和scaleY进行相应调整。 "1.0"将是正常大小,任何".0"中的内容都会减小它,大于"1.0"的任何内容都会增加它。
你还可以参考链接使用自定义评分栏,点击link获取自定义评分栏并享受评分栏。
<RatingBar
  android:id="@+id/ratingBar"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:scaleX="0.5"
  android:scaleY="0.5" />

0
这并不是一个确切的答案,但我想展示一种替代方案。使用一个叫做Iconify的库,它允许你在Android应用中使用可缩放矢量图标,并且通过一个简单的方法,你可以创建出带有图标的很棒的评分条。
这个方法是:
public static String montarEstrellasValoracion(float valoration,int starSize) {
    String result="";
    float cont=1f;

    for(float i=1f;i<=valoration;i++){
        if(valoracion==0){
            break;
        }
        cont=i;
        if((cont+0.5f)>=(valoration) && valoracion!=5f){
            result+="{fa-star "+starSize+"dp} ";
            result+="{fa-star-half-o "+starSize+"dp} ";
            cont++;
            break;
        }else if((cont+0.5f)<(valoration) && (cont+1f)>(valoration) && valoration!=5f){
            result+="{fa-star "+starSize+"dp} ";
            result+="{fa-star "+starSize+"dp} ";
            cont++;
            break;
        }

        if(cont<=5){
            result+="{fa-star "+starSize+"dp} ";
        }

    }

    for(float j=cont;j<5f;j++){
        result+="{fa-star-o "+starSize+"dp} ";
    }

    if(valoration==0){
        result+="{fa-star-o "+starSize+"dp}";
    }

    return result;
}

然后在onCreate方法中:

IconTextView valoracion = (IconTextView)item.findViewById(R.id.id_icon_textview);

valoracion.setText(montarEstrellasValoracion(valoration,15)); valoracion.setTextColor(Color.parseColor("#000");

图标来自另一个很棒的网站,名为 Font Awesome
希望这能帮到任何人!

0

除了xleon所展示的缩放之外,还需设置transformPivotX=“0dp”,然后设置自定义高度。

android:scaleX="0.7"
android:scaleY="0.7"
android:transformPivotX="0dp"
android:height="40dp"

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