当前位置: 首页 > 面试题库 >

自定义Android Ratingbar

颛孙星海
2023-03-14
问题内容

我想在锻炼应用程序中实现自定义RatingBar。条形图应具有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" />

我想用自定义图像替换默认的星星。但是,四颗星中的每一个都应该具有不同的图像:

星号1 =“ X”,表示“此项目已禁用”

星号2 =拇指朝下

星号3 =代表“中立等级”的事物

星号4 =大拇指

另外,例如,当该商品的等级为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();
    }
}

问题答案:

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



 类似资料:
  • 感谢SpanInjector和SpanExtractor,您可以自定义spans的创建和传播方式。 目前有两种在进程之间传递跟踪信息的内置方式: 通过Spring Integration 通过HTTP Span ids从Zipkin兼容(B3)头(Message或HTTP头)中提取,以启动或加入现有跟踪。跟踪信息被注入到任何出站请求中,所以下一跳可以提取它们。 与以前版本的Sleuth相比,重要的

  • whistle提供了插件的方式扩展协议,具体参考:插件开发

  • 问题内容: 美好的一天。 如果可以根据需要更改JLabel和JTextField字体大小,是否还可以更改JTable的列名和元素的字体样式(大小,外观,颜色)? 另外,我正在使用Windows的外观。 谢谢, 问题答案: 有默认值,以及和。您可以使用与键来覆盖默认。

  • 问题内容: 美好的一天。 如果可以根据需要更改JLabel和JTextField字体大小,是否还可以更改JTable的列名和元素的字体样式(大小,外观,颜色)? 另外,我正在使用Windows的外观。 谢谢, 问题答案: 有默认值,以及和。您可以使用与键来覆盖默认。

  • 问题内容: 我正在尝试在发送XHR之前先听它们。该方法类似于jQuery的beforeSend。 我的目标是在发送所有XHR之前监听它们。我想最接近的事情是检查上面是否? 上面的代码是否会因为我使用原型而导致诸如jQuery之类的ajax库出现故障? 问题答案: 我正在尝试在发送XHR之前先听它们。 然后尝试欺骗该方法,而不是一种。 上面的代码是否会因为我在XMLHttpRequest上使用原型而

  • 问题内容: 如何创建自定义的ViewPager?要在ViewPager中实例化页面,就像这样: 有没有办法在从Adapter扩展的Class中像这样膨胀: 问题答案: 这仅是示例,但运行正常。

  • 我在考虑用Java更改。基本上,我需要添加打印按钮沿ok按钮的对话,所以如果用户点击ok简单地关闭它,或者如果点击打印按钮,然后继续对打印按钮actionevent。

  • 我们需要实现的功能是: /druid或/rs下的路径,就无条件跳过NutFilter 打开web.xml,配置exclusions <filter> <filter-name>nutz</filter-name> <filter-class>org.nutz.mvc.NutFilter</filter-class> <init-param> <param-n