You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Android RatingBar中星星之间的间距?

修改RatingBar星星间距的两种方法

嘿,我来帮你搞定RatingBar星星间距的问题~根据你的代码,这里有两种可行方案,适配不同的Android版本:

方法一:兼容低版本(API <26)

通过修改RatingBar的LayerDrawable中每个星星Drawable的内边距来实现间距调整,步骤如下:

  1. 先添加一个dp转px的工具方法(Android尺寸计算需要用像素单位):
private int dpToPx(int dp) {
    return (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        dp,
        getContext().getResources().getDisplayMetrics()
    );
}
  1. 在你的createControl()方法中,拿到LayerDrawable后,给每个层的Drawable包裹InsetDrawable来设置间距:
protected Object createControl() { 
    LinearLayout layout = new LinearLayout(getContext()); 
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT, 
        LinearLayout.LayoutParams.WRAP_CONTENT
    ); 
    final RatingBar ratingBar = new android.widget.RatingBar(getContext()); 
    LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable(); 
    
    // --- 新增:调整星星间距的代码 ---
    int spacingDp = 5; // 自定义间距大小,单位dp
    int spacingPx = dpToPx(spacingDp);
    for (int i = 0; i < stars.getNumberOfLayers(); i++) {
        Drawable drawable = stars.getDrawable(i);
        // 解析默认的ScaleDrawable,拿到实际的星星Drawable
        if (drawable instanceof ScaleDrawable) {
            drawable = ((ScaleDrawable) drawable).getDrawable();
        }
        // 给每个星星添加右边间距(若要左右均匀间距,可调整为左右各spacingPx/2)
        InsetDrawable insetDrawable = new InsetDrawable(drawable, 0, 0, spacingPx, 0);
        stars.setDrawableByLayerId(stars.getId(i), insetDrawable);
    }
    // --- 新增结束 ---
    
    ratingBar.setStepSize((float) 1.0); 
    ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { 
        @Override 
        public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
            LayerDrawable layerDrawable = (LayerDrawable) ratingBar.getProgressDrawable(); 
            DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)), Color.parseColor("#3C3F41")); 
            DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)), Color.parseColor("#F7C065")); 
            DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)), Color.parseColor("#F7C065")); 
        } 
    }); 
    layout.addView(ratingBar, params); 
    return layout; 
}

方法二:API 26+ 简便写法

如果你的APP最低兼容版本是Android 8.0(API 26)及以上,直接调用RatingBar的setSpacing()方法即可,一行代码搞定:

// 在创建ratingBar后添加这行
ratingBar.setSpacing(dpToPx(5)); // 设置5dp的星星间距

小提示

  • 调整间距后如果RatingBar宽度不足导致星星换行,可以适当缩小间距值,或者给RatingBar设置足够的宽度。
  • 若想要星星左右间距更均匀,可以把InsetDrawable的参数改为new InsetDrawable(drawable, spacingPx/2, 0, spacingPx/2, 0),让左右各分配一半间距。

内容的提问来源于stack exchange,提问作者Sparks Sh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:35:01