自定义Android评分条

3

我想在我的健身应用程序中实现自定义评分栏。该栏应具有4个星级和步长为1。布局如下:

<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个星形图标应该使用不同的图片:
第一个星形图标 = 一个“X”,表示“此项已禁用”
第二个星形图标 = 拇指向下
第三个星形图标 = 代表“中立评级”的某些东西
第四个星形图标 = 拇指向上
另外,例如当物品被评为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);
    }
}

很遗憾,它没有起作用。它只绘制了普通的星形和我的自定义图像作为背景。

有人知道如何帮助我解决这个问题吗?

更新

感谢 Gabe,我的 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();
    }
}

我们可以用一半的评分吗? - Padma Kumar
1个回答

2
不要调用super.onDraw-这将绘制普通的星星。从那里开始,还有什么不起作用的吗?

哦,谢谢你的小提示。在我让它工作后,我意识到我的替换图像都被绘制了。但是都在同一个位置上。我已经在我的问题中添加了新的(实验性的)onDraw方法。 - Oliver
你不需要使用canvas.save,只有在想要暂时使用不同矩阵时才需要。不确定这是否会导致问题。否则,代码看起来差不多正确。如果没有使用它,你仍然只绘制了1张图片吗? - Gabe Sechan
您是对的,canvas.save不是必需的。在第一段代码中,它们全部都绘制在x和y = 0处。但现在它真的很好用。 - Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接