2013-08-30 25 views
5

5 farklı renge sahip ve yıldızların altında yıldızlarla dikdörtgen çubuğu olan özel bir RatingBar oluşturdum.Zencefilli cihazlarda özel değerlendirme çubuğu

enter image description here

Ben yerlerden birkaç bu görüşü kullanıyorum ve her şeyi 4.0+ Android'de ok: Burada benziyor nasıl. Ama Gingerbread'da bazı sorunum var.

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 + ""); 
} 
} 

Bu çizgi kafa karıştırıcı: İşte görünüm sınıfının kodudur mStars.setProgressDrawable(GUI.buildRatingBarDrawables(new Bitmap[]{bmp_empty, bmp_half, bmp_full})); ama (sadece bir gerilmiş yıldızı gösteriyor) setProgressDrawable() çağrısından sonra yıldızlı render çünkü sorunun bu olması gerekiyordu.

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; 
} 

Böylece, her şey Android ICS üzerinde ok ve daha yeni ama Gingerbread üzerinde bazı ilginç durumlar vardır: İşte yöntem buildRatingBarDrawables olduğunu. Her şeyden önce bazen zencefilli her şey sadece tamam. Ama çoğu kez hiç yıldız yok. Noktalı dikdörtgen çubuk her zaman haklıdır, ancak yıldızlar bazen kaybolur.

enter image description here

Gördüğünüz gibi, bazen ok, bazen gelmez:/Benim navigasyon SlidingMenu bu derece bar var Burada her satırda derece çubuğunu kullanın ListView örnek ekranına içindir ve yavaşça kaydırdığımda yıldızlar da gösterilir, ancak slayt bittikten sonra (Açıkken arama yapıldığında) yıldızlar kaybolur.

size bana o daha mutlu kılan herhangi thougths var :)

Ben derece düzeni için xml dosyası ekledi:?

<?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

yıldız kaybolur, oldu da görünürdü hiyerarşi görüntüleyici, kendi durumunu görmek için (uygun boyuta sahipse) – Luksprog

+0

Farklı ekran boyutlarında zencefil ekmeği cihazlarını denediniz mi? Bu bir ekran boyutu sorunu mu? – user1634451

cevap

2

Bir katmanın içine ratinginiz drawables tanımlamak için daha kolay bir yaklaşım olur liste çizilebilir ve sonra RatingBar sınıfına atayın. Benim için android zencefilli ve daha önce çalışır. Örneğin drawables klasörüne o içine ve xml dosyasına Kaydet

<?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> 

, myCustomRatingBarDrawable.xml

Sonra herhangi RatingBar görünümde:

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