2013-02-14 106 views
2

我想在我的鍛鍊應用程序中實現自定義RatingBar。酒吧應該有4顆星,步長爲1.佈局看起來像這樣:自定義Android Ratingbar

<com.example.workouttest.MyBar 
    android:id="@+id/rating" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:max="4" 
    android:numStars="4" 
    android:stepSize="1" 
    android:scaleX="0.6" 
    android:scaleY="0.6" 
    android:layout_gravity="right" /> 

我想用自定義圖像替換默認的星星。但每一個4分應該具有不同的圖像:

星1 =一個「X」,這意味着「這個項目被禁用」

星2 =拇指向下

星3 =一些代表「中性評級」

星4 =讚許

Addtitionally時,例如,該項目被評爲具有3(中性評級),所有其他分(1,2和4)應顯示一個灰色他們的形象的出版版本。

我試圖從的RatingBar延伸並與下面的代碼上來:

public class MyBar extends RatingBar { 

    private int[] starArrayColor = { 
      R.drawable.star_1_color, 
      R.drawable.star_2_color, 
      R.drawable.star_3_color, 
      R.drawable.star_4_color 
    }; 

    private int[] starArrayGrey = { 
      R.drawable.star_1_grey, 
      R.drawable.star_2_grey, 
      R.drawable.star_3_grey, 
      R.drawable.star_4_grey 
    }; 

    public MyBar(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public MyBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyBar(Context context) { 
     super(context); 
    } 

    @Override 
    protected synchronized void onDraw(Canvas canvas) { 
     int stars = getNumStars(); 
     float rating = getRating(); 

     for (int i=0;i<stars;i++) { 
      Bitmap bitmap; 
      Resources res = getResources(); 
      Paint paint = new Paint(); 

      if ((int) rating == i) { 
       bitmap = BitmapFactory.decodeResource(res, starArrayColor[i]); 
      } else { 
       bitmap = BitmapFactory.decodeResource(res, starArrayGrey[i]); 
      } 
      canvas.drawBitmap(bitmap, 0, 0, paint); 
      canvas.save(); 
     } 

     super.onDraw(canvas); 
    } 
} 

遺憾的是它沒有工作。它以我的自定義圖像作爲背景畫出正常的星星。

在這裏有人誰知道如何幫助我解決這個問題?

UPDATE

感謝加布我工作的onDraw方法現在看起來是這樣的:

@Override 
protected synchronized void onDraw(Canvas canvas) { 
    int stars = getNumStars(); 
    float rating = getRating(); 
    float x = 0; 

    for (int i=0;i<stars;i++) { 
     Bitmap bitmap; 
     Resources res = getResources(); 
     Paint paint = new Paint(); 
     x += 50; 

     if ((int) rating-1 == i) { 
      bitmap = BitmapFactory.decodeResource(res, starArrayColor[i]); 
     } else { 
      bitmap = BitmapFactory.decodeResource(res, starArrayGrey[i]); 
     } 
     Bitmap scaled = Bitmap.createScaledBitmap(bitmap, 48, 48, true); 
     canvas.drawBitmap(scaled, x, 0, paint); 
     canvas.save(); 
    } 
} 
+0

我們可以做半評估。 – 2016-08-03 10:34:40

回答

1

不要叫super.onDraw-會得出正常的恆星。從那裏,還有什麼不起作用?

+0

哦,謝謝你的這個小提示。在我得到這個工作後,我意識到我的替換圖像已經全部繪製完畢。但都在同一個地方。我已將新的(實驗性)onDraw方法添加到我的問題中。 – Oliver 2013-02-14 21:00:58

+0

你不需要使用canvas.save,只有當你想在一段時間內使用不同的矩陣時才需要。不知道這是否會把事情搞砸。否則代碼看起來是正確的。沒有這些,你仍然只能得到1個圖像? – 2013-02-14 21:24:25

+0

你說得對,canvas.save是不需要的。在第一個代碼中,它們都是在x和y = 0處繪製的。但現在它確實很好用。 – Oliver 2013-02-14 21:36:52