2013-08-30 33 views
5

我创建了一个自定义评分栏,它可以有5种不同的颜色,并且具有矩形条,点下面有星星。这里是什么样子:姜饼设备上的自定义评分栏

enter image description here

我使用的几个地方这种观点,一切都在Android 4.0+确定。但姜饼我有一些问题。下面是视图类代码:

public class KrinsenRating extends RelativeLayout { 

private TextView mRanking; 
private RatingBar mStars; 

public KrinsenRating(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    layoutInflater.inflate(R.layout.krinsen_rating, this); 

    loadViews(); 
} 

public KrinsenRating(Context context) { 
    super(context); 

    loadViews(); 
} 

private void loadViews() { 
    mRanking = (TextView) findViewById(R.id.ranking_bar_position); 
    mStars = (RatingBar) findViewById(R.id.ranking_bar); 
} 

public void setRating(long rating){ 
    RatingConverter rc = new RatingConverter(rating); 

    Bitmap bmp_empty = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_empty)).getBitmap(); 
    Bitmap bmp_half = null; 
    Bitmap bmp_full = null; 

    switch (rc.getColor()) { 
    case 1: 
     bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half1)).getBitmap(); 
     bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full1)).getBitmap(); 

     mRanking.setBackgroundColor(getResources().getColor(R.color.ranking1)); 
     break; 
    case 2: 
     bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half2)).getBitmap(); 
     bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full2)).getBitmap(); 

     mRanking.setBackgroundColor(getResources().getColor(R.color.ranking2)); 
     break; 
    case 3: 
     bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half3)).getBitmap(); 
     bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full3)).getBitmap(); 

     mRanking.setBackgroundColor(getResources().getColor(R.color.ranking3)); 
     break; 
    case 4: 
     bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half4)).getBitmap(); 
     bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full4)).getBitmap(); 

     mRanking.setBackgroundColor(getResources().getColor(R.color.ranking4)); 
     break; 
    case 5: 
     bmp_half = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_half5)).getBitmap(); 
     bmp_full = ((BitmapDrawable) getResources().getDrawable(R.drawable.star_full5)).getBitmap(); 

     mRanking.setBackgroundColor(getResources().getColor(R.color.ranking5)); 
     break; 
    } 

    mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full})); 
    mStars.setRating(rc.getRealRating()); 
    mRanking.setText(rating + ""); 
} 
} 

此行是混乱的:mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full}));,但我在后setProgressDrawable()调用(只有一个拉伸明星出)呈现明星都必须有这一点,因为问题。下面是方法buildRatingBarDrawables

public static Drawable buildRatingBarDrawables(Bitmap[] images) { 
    final int[] requiredIds = { android.R.id.background, 
      android.R.id.secondaryProgress, android.R.id.progress }; 
    final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; 
    Drawable[] pieces = new Drawable[3]; 
    for (int i = 0; i < 3; i++) { 
     ShapeDrawable sd = new ShapeDrawable(new RoundRectShape(
       roundedCorners, null, null)); 
     BitmapShader bitmapShader = new BitmapShader(images[i], 
       Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); 
     sd.getPaint().setShader(bitmapShader); 
     ClipDrawable cd = new ClipDrawable(sd, Gravity.LEFT, 
       ClipDrawable.HORIZONTAL); 
     if (i == 0) { 
      pieces[i] = sd; 
     } else { 
      pieces[i] = cd; 
     } 
    } 
    LayerDrawable ld = new LayerDrawable(pieces); 
    for (int i = 0; i < 3; i++) { 
     ld.setId(i, requiredIds[i]); 
    } 
    return ld; 
} 

所以,一切都很好在Android ICS和更新,但在姜饼我有一些奇怪的情况。首先有时在姜饼上一切都很好。但往往是没有明星。带点的矩形条总是正确的,但星星有时会消失。下面是示例屏幕从ListView其使用的评价栏的每一个行:

enter image description here

就像你所看到的,有时候是好的,有时不:/我有我的导航slidingMenu这个等级吧当我缓慢地滑动时会显示星星,但在滑动结束后(当onOpened应该调用时),星星会消失。

有你,让我与快乐任何thougths :)

我添加xml文件的评级布局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/avatar_layout" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center" > 

<RatingBar 
    android:id="@+id/ranking_bar" 
    android:layout_width="wrap_content" 
    android:layout_height="30dp" 
    android:layout_centerHorizontal="true" 
    android:clickable="false" 
    android:focusable="false" 
    android:isIndicator="true" 
    android:numStars="3" 
    android:progressDrawable="@drawable/krinsen_rating" 
    android:stepSize="0.1" /> 

<TextView 
    android:id="@+id/ranking_bar_position" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/ranking_bar" 
    android:layout_centerHorizontal="true" 
    android:contentDescription="@string/register_avatar" 
    android:paddingBottom="2dp" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp" 
    android:paddingTop="2dp" 
    android:textColor="@android:color/white" 
    android:textSize="14sp" 
    android:textStyle="bold" /> 
    </RelativeLayout> 
+1

当星星消失了,没有你看用层次结构查看器在组成视图中查看其状态(如果它们具有适当的大小)? – Luksprog

+0

您是否尝试过不同屏幕尺寸的姜面包设备,可能是屏幕尺寸问题? – user1634451

回答

2

这是定义你的等级可绘制成层的更简单的方法列表可绘制,然后将其分配给您的RatingBar类。它适用于Android姜饼和我之前。

<?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_empty" /> 
    <item android:id="@+android:id/secondaryProgress" 
      android:drawable="@drawable/star_empty" /> 
    <item android:id="@+android:id/progress" 
      android:drawable="@drawable/star_full" /> 
</layer-list> 

保存到这一点和XML文件到文件夹可绘,例如,myCustomRatingBarDrawable.xml

然后在任意的RatingBar观点:

<RatingBar 
     android:id="@+id/ratingbar" 
     android:progressDrawable="@drawable/myCustomRatingBarDrawable" 
     android:isIndicator="true" 
     android:max="5" 
     android:numStars="5" 
     ... 
/>