Benutzerdefinierte Android-Bewertungsleiste
Ich möchte eine benutzerdefinierte RatingBar in meiner Trainings-App implementieren. Die Leiste sollte 4 Sterne und eine Schrittgröße von 1 haben. Das Layout sieht folgendermaßen aus:
<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" />
Ich möchte die Standardsterne durch benutzerdefinierte Bilder ersetzen. Aber jeder der 4 Sterne sollte ein anderes Bild haben:
Stern 1 = ein "X" bedeutet "dieser Gegenstand ist deaktiviert"
Stern 2 = Daumen runter
Stern 3 = etwas, das eine "neutrale Bewertung" darstellt
Stern 4 = Daumen hoch
Zusätzlich sollten alle anderen Sterne (1,2 und 4) eine ausgegraute Version ihres Bildes anzeigen, wenn der Gegenstand beispielsweise mit einer 3 (neutrale Bewertung) bewertet ist.
Ich habe versucht, von RatingBar zu verlängern, und habe den folgenden Code gefunden:
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);
}
}
Leider hat es nicht geklappt. Es zeichnet nur die normalen Sterne mit meinen benutzerdefinierten Bildern als Hintergrund.
Ist hier jemand, der mir helfen kann, dieses Problem zu lösen?
AKTUALISIEREN
Dank Gabe sieht meine onDraw-Methode jetzt so aus:
@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();
}
}