如何修改Android RatingBar中星星之间的间距?
修改RatingBar星星间距的两种方法
嘿,我来帮你搞定RatingBar星星间距的问题~根据你的代码,这里有两种可行方案,适配不同的Android版本:
方法一:兼容低版本(API <26)
通过修改RatingBar的LayerDrawable中每个星星Drawable的内边距来实现间距调整,步骤如下:
- 先添加一个dp转px的工具方法(Android尺寸计算需要用像素单位):
private int dpToPx(int dp) { return (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dp, getContext().getResources().getDisplayMetrics() ); }
- 在你的
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
相关产品推荐
相关产品推荐

