Android自定义RatingBar图像工件

时间:2012-02-20 05:59:13

标签: android layout rating

我在RatingBar项目的应用程序中实现了自定义ListView。 自定义样式 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/star_off" />
    <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/star_on" />
    <item android:id="@android:id/progress" android:drawable="@drawable/star_on" />
</layer-list>

这是ListItem布局的一部分:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingLeft="15dp" >

    <RatingBar
        android:id="@+id/li_company_rating"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_marginBottom="1dp"
        android:isIndicator="true"
        android:numStars="5"
        android:progressDrawable="@drawable/ratingbar_red"
        android:stepSize="1" />

    <Button
        android:id="@+id/li_company_callbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="0dp"
        android:layout_marginLeft="40dp"
        android:contentDescription="@string/ContentDescription"
        android:drawableLeft="@drawable/phone_icon"
        android:drawablePadding="5dp"
        android:onClick="callbtn_Click"
        android:text="@string/CallButton"
        android:focusable="false"
        android:focusableInTouchMode="false" >
    </Button>

</LinearLayout>

它可以工作,但是当设置评级时,我会得到一些奇怪的图像伪像;粉红色星星下面有2条垂直线出现在我的视线中:

enter image description here

这是 star_on.png

link

star_off.png 看起来没问题,如果评分== 0,则不显示这些行。

我是android初学者,无法理解问题所在。

10 个答案:

答案 0 :(得分:16)

尝试在xml布局中为RatingBar提供高度,如下所示:

android:layout_height="30dp" 

30dp或任何适合你的东西..

Check out why is this happening ??

答案 1 :(得分:3)

我有这个问题,看起来像被拉伸的自定义星形图像的底边。您不必设置评级栏标签的layout_height。您可以在额定条上设置最小/最大高度(与图像高度相同)。

我的样式xml示例。

<style name="GoldRatingBar" parent="@android:style/Widget.RatingBar">
  <item name="android:minHeight">@dimen/rating_bar_height</item>
  <item name="android:maxHeight">@dimen/rating_bar_height</item>
</style>

Dimens.xml

<dimen name="rating_bar_height">11dp</dimen>

该值应与使用的drawable的值相匹配。 11像素高的图像,所以rating_bar_height设置为11dp。

答案 2 :(得分:2)

另一个简单的解决方案是使用像photoshop这样的图像编辑器在星形图像中留下一行空像素。然后,评级栏中重复或拉伸的像素行将为空。这种方法解决了我的问题。

答案 3 :(得分:2)

我以另一种方式解决了这个问题。我拿自定义的星形png,并在图像编辑器中添加透明线到图像的底部。垂直线条的问题在所有屏幕上都消失了!

答案 4 :(得分:2)

它是一个Icon设计问题。这里的问题是图标周围的填充。如果要创建自定义星形图标,请确保在星形和它所在的页面边界之间留下一些填充空间。

如果您不确定如何操作,请尝试Android Asset Studio。您可以看到类似“Padding around Optical Icon”之类的内容,请勿将其保持为0 dip。

答案 5 :(得分:2)

每个人都在暗示某些事情,但没有任何机构试图解释为什么会这样。我现在要试着解释一下。当然,只有在您尝试自定义评级栏图像时才会发生这种情况。

想象一下,我们有大小为72x72像素的自定义图像,这是我们XXXHDPI的资源 - (它是4倍)。

  1. 同样的图像也需要复制XXHDPI,XHDPI,HDPI,MDPI和LDPI。我现在将错过最后一个资源目录。
  2. 在不同目录中,此图像需要如下所示:
    • 对于XXHDPI尺寸的复印图像需要为54x54(这是3x)
    • 对于XHDPI大小的复制图像需要为36x36(这是2x)
    • 对于HDPI大小的复制图像需要为27x27(这是1.5倍)
    • 对于MDPI大小的复制图像需要为18x18(这是1x)
  3. 所以现在在这种情况下,如果您的评分栏的高度大于 18 dp ,例如30 dp,您将在每个星形图像下方看到这个不良图像伪影,因为很明显,RatingBar正在尝试填充其余部分的高度与某物(你的图像是18 dp,但条的高度是30dp),所以休息12dp将填充这些人工制品。
  4. 这就是为什么如果你将评级栏高度设置为固定大小,一切都可以,但也可以。但是也可以。所有这些都取决于您的自定义图像大小。

    我认为有一种解决方案适用于所有可能的场景,这是:

    1. 为您的应用支持XXXHDPI,XXHDPI或您想要的所有设备屏幕创建图片资源。
    2. 如果您的(MDPI为1x)图像的高度为20像素,请确保您的RatingBar高度不会大于20 dp,一切都会正常。
    3. 注意:在整个对话中,我们讨论的是不在px中的dp(密度像素),因为如果我们在每个res文件夹中提供所有这些图像资源,我们将有机会使用dp而不是px。我希望最后一句话清楚明白。

      编辑:另一种可能的方法是在自定义图像的底部留下一些小填充(空白空间),可能是1px或2px。在这种情况下,RatingBar视图不会显示那些人工制品像素,因为它们将从自定义图像的填充部分中获取,实际上它只是空(透明)像素。我个人认为,这不是最好的方法,因为图像填充将在RatingBar和布局内的其余视图之间创建一些空间(填充)。在这种情况下,您将无法完全控制视图空间,因为一些小部分已在自定义图像内部进行了硬编码(那些2 px填充)。

答案 6 :(得分:1)

在Photoshop中的图像明星中只有2个像素填充。 在xml中填充不起作用,只需在photoshop中填充星形图像。 它的工作非常好。

答案 7 :(得分:0)

我通过减少“layout_height”修复了同样的问题,因为我的图像高度小于layout_height中的高度。

答案 8 :(得分:0)

同样的问题。就我而言 将自定义星形图像放在/ Drawable文件夹中 并设置"android:layout_height="30dip"

工作正常!!

答案 9 :(得分:0)

由于可绘制矢量,我一直在观察该问题。 一旦添加了相应的png图像,它就会开始工作。 将此添加为答案,因为它可能对面临相同问题的人有所帮助。