Android RatingBar更改明星的颜色

我怎样才能改变星星的颜色,如何改变星星的尺寸?

第一步:创build自己的样式,通过克隆现有样式之一(从$ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml ),将其放入自己的项目styles.xml ,并引用它当您将小部件添加到布局时。

步骤2:为RatingBar创build自己的LayerDrawable XML资源,指向适当的图像用于栏。 原始样式将指向您可以与之比较的现有资源。 然后,调整你的风格来使用你自己的LayerDrawable资源,而不是内置的。

在提到的博客里有点复杂,我用了一个类似但更简单的方法。 你确实需要3星的图像(red_star_full.png,red_star_half.png和red_star_empty.png)和一个xml,就这些。

把这3张图片放在res / drawable中。

在那里放置下面的ratingbar_red.xml:

 <?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background" android:drawable="@drawable/red_star_empty" /> <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/red_star_half" /> <item android:id="@android:id/progress" android:drawable="@drawable/red_star_full" /> </layer-list> 

最后,告诉你的评分栏定义使用这个,即

 <RatingBar android:progressDrawable="@drawable/ratingbar_red"/> 

而已。

试试这个,如果你只想改变颜色:

 RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar); LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable(); stars.getDrawable(2).setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP); 

2015更新

现在你可以使用DrawableCompat来绘制所有types的drawable。 例如:

 Drawable progress = ratingBar.getProgressDrawable(); DrawableCompat.setTint(progress, Color.WHITE); 

这是向后兼容API 4

为我工作的最简单的方法…如果你正在扩展AppCompat活动

在你的build.gradle中添加最新的appcompat库。

 dependencies { compile 'com.android.support:appcompat-v7:XXX' // where XXX version } 

使您的活动扩展android.support.v7.app.AppCompatActivity

 public class MainActivity extends AppCompatActivity { ... } 

在styles.xml文件中声明自定义样式。

 <style name="RatingBar" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/indigo</item> <item name="colorControlActivated">@color/pink</item> </style> 

通过android:theme属性将此样式应用于您的RatingBar。

 <RatingBar android:theme="@style/RatingBar" android:rating="3" android:stepSize="0.5" android:numStars="5" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

如果你想改变所有星星的颜色,你可以使用:

 LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable(); stars.getDrawable(2).setColorFilter(getResources().getColor(R.color.starFullySelected), PorterDuff.Mode.SRC_ATOP); stars.getDrawable(1).setColorFilter(getResources().getColor(R.color.starPartiallySelected), PorterDuff.Mode.SRC_ATOP); stars.getDrawable(0).setColorFilter(getResources().getColor(R.color.starNotSelected), PorterDuff.Mode.SRC_ATOP); 

Alex和CommonsWares发布的解决scheme是正确的。 Android从来没有谈到的一件事是适当的像素大小不同的密度。 这里是基于光环的每个密度所需的尺寸。

小星星

 mdpi: 16px hdpi: 24px xhdpi: 32px xxhdpi: 48px 

中星

 mdpi: 24px hdpi: 36px xhdpi: 48px xxhdpi: 72px 

大星

 mdpi: 35px hdpi: 52px xhdpi: 69px xxhdpi: 105px 

从API 21开始,用这三行很容易改变星星的颜色:

 android:progressTint="@android:color/holo_red_dark" android:progressBackgroundTint="@android:color/holo_red_dark" android:secondaryProgressTint="@android:color/holo_red_dark" 

这样做,您可以更改背景颜色和星星的边框颜色。

所以我一直在为这个问题挣扎了两个小时,而且我已经为所有的API版本提供了一个工作解决scheme,其中也显示了半星评级。

 private void setRatingStarColor(Drawable drawable, @ColorInt int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { DrawableCompat.setTint(drawable, color); } else { drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); } } 

你用这个可绘制的顺序调用方法:

  LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable(); // Filled stars setRatingStarColor(stars.getDrawable(2), ContextCompat.getColor(getContext(), R.color.foreground)); // Half filled stars setRatingStarColor(stars.getDrawable(1), ContextCompat.getColor(getContext(), R.color.background)); // Empty stars setRatingStarColor(stars.getDrawable(0), ContextCompat.getColor(getContext(), R.color.background)); 

注意:还必须在XML中指定属性“max”和“numStars”,否则不显示半星。

现在,您可以使用AppCompat v22.1.0以后的DrawableCompatdynamic着色所有types的drawable,这对于使用一组drawable支持多个主题很有用。 例如:

 LayerDrawable layerDrawable = (LayerDrawable) ratingBar.getProgressDrawable(); DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)), Color.RED); // Empty star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)), Color.GREEN); // Partial star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)), Color.BLUE); // Full star 

这可以向下兼容到API 4.另请参阅Chris Banes在Support Libraries v22.1.0上的博客文章

对于实际的大小和形状,您将需要为适当的大小定义新的样式和图层列表drawable,正如其他人已经在上面回答的那样。

只需更改xml的评分栏颜色: –

 android:progressTint="@color/your_color" android:backgroundTint="@color/your_color" android:secondaryProgressTint="@color/your_color" 

使用android:theme属性:

styles.xml

 <style name="Theme.Rating" parent="Theme.AppCompat.Light"> <item name="colorAccent">@color/rating</item> </style> 

layout.xml

 <android.support.v7.widget.AppCompatRatingBar android:theme="@style/Theme.Rating" android:numStars="5" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

要改变颜色,你只需要设置参数android:progressTint

  <RatingBar android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginTop="15dp" android:numStars="5" android:rating="1" android:progressTint="@android:/color/black" android:layout_gravity="center" /> 

对于样式属性的大小。

build立@ lgvalle的答案。

2015更新

现在你可以使用DrawableCompat来绘制所有types的drawable。 例如:

Drawable progress = ratingBar.getProgressDrawable(); DrawableCompat.setTint(progress,Color.WHITE); 这是向后兼容API 4

 LayerDrawable drawable = (LayerDrawable) getProgressDrawable(); Drawable progress = drawable.getDrawable(2); DrawableCompat.setTint(progress, getResources().getColor(COLOR1)); progress = drawable.getDrawable(1); DrawableCompat.setTintMode(progress, PorterDuff.Mode.DST_ATOP); DrawableCompat.setTint(progress, getResources().getColor(COLOR1)); DrawableCompat.setTintMode(progress, PorterDuff.Mode.SRC_ATOP); DrawableCompat.setTint(progress, getResources().getColor(COLOR2)); progress = drawable.getDrawable(0); DrawableCompat.setTint(progress, getResources().getColor(COLOR2)); 

这将保持分数步骤的颜色。

 <!--For rating bar --> <style name="RatingBarfeed" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/colorPrimary</item> <item name="colorControlActivated">@color/colorPrimary</item> </style> 

使用你自己的颜色

无需添加新的样式,您可以使用RatingBar的色调颜色

  <RatingBar android:id="@+id/ratingBar" style="@android:style/Widget.Holo.RatingBar.Small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="5" android:rating="4.5" android:stepSize="0.5" android:progressTint="@color/colorPrimary"/> 

我解决这个问题如下:

 LayerDrawable layerDrawable = (LayerDrawable) ratingBar.getProgressDrawable(); DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)), Color.WHITE); // Empty star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)), Color.YELLOW); // Partial star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)), Color.YELLOW); 
 RatingBar mRating=(RatingBar)findViewById(R.id.rating); LayerDrawable layerDrawable=(LayerDrawable)mRating.getProgressDrawable(); layerDrawable.getDrawable(2).setColorFilter(Color.parseColor ("#32CD32"), PorterDuff.Mode.SRC_ATOP); 

对我来说,它的工作….

适用于Android版本21以下的版本

经过一番研究,我想出了这个方法来设置背景色调,间隙色调(例如:半星)和星星色调。

 LayerDrawable layers = (LayerDrawable) ratingBar.getProgressDrawable(); DrawableCompat.setTint(layers.getDrawable(0), 0x33000000); // The background tint DrawableCompat.setTint(layers.getDrawable(1), 0x00000000); // The gap tint (Transparent in this case so the gap doesnt seem darker than the background) DrawableCompat.setTint(layers.getDrawable(2), 0xffFED80A); // The star tint 

我发现一个简单的解决scheme,根据你的主题改变星星的颜色。

去这个网站: http : //android-holo-colors.com/

select你的主题颜色,并获得您创build的星形图像。

使用上面的答案,我创build了一个快速的静态方法,可以轻松地重新使用。 它只是为了激活星星的颜色。 未激活的星星仍然是灰色的。

  public static RatingBar tintRatingBar (RatingBar ratingBar, int progressColor)if (ratingBar.getProgressDrawable() instanceof LayerDrawable) { LayerDrawable progressDrawable = (LayerDrawable) ratingBar.getProgressDrawable(); Drawable drawable = progressDrawable.getDrawable(2); Drawable compat = DrawableCompat.wrap(drawable); DrawableCompat.setTint(compat, progressColor); Drawable[] drawables = new Drawable[3]; drawables[2] = compat; drawables[0] = progressDrawable.getDrawable(0); drawables[1] = progressDrawable.getDrawable(1); LayerDrawable layerDrawable = new LayerDrawable(drawables); ratingBar.setProgressDrawable(layerDrawable); return ratingBar; } else { Drawable progressDrawable = ratingBar.getProgressDrawable(); Drawable compat = DrawableCompat.wrap(progressDrawable); DrawableCompat.setTint(compat, progressColor); ratingBar.setProgressDrawable(compat); return ratingBar; } } 

只需通过您的评级栏和颜色使用getResources().getColor(R.color.my_rating_color)

正如你所看到的,我使用DrawableCompat,因此它是向后兼容的。

编辑:这种方法不适用于API21(去图为什么)。 调用setProgressBar时,最终会出现NullPointerException。 我最终禁用API> = 21上的整个方法。

对于API> = 21,我使用SupperPuccio解决scheme。

1)声明这个XML

 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" android:paddingLeft="20dp" android:paddingRight="20dp" android:layout_marginBottom="20dp" android:background="#323232" android:gravity="center_horizontal"> <com.example.android.custom_ratingbar.CustomRatingBar android:id="@+id/coloredRatingBar5" style="@style/coloredRatingBarStyleSmall" android:layout_width="wrap_content" android:layout_height="match_parent" /> </LinearLayout> 

2)在style.xml中

 <style name="coloredRatingBarStyleSmall"> <item name="indicator">false</item> <item name="type">small</item> </style> 

3)

 import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class CustomRatingBar extends View{ private static final String TAG="ColoredRatingBar"; private static final int NORMAL = 0; private static final int SMALL = 1; Bitmap[] drawables; Bitmap progressBackground; Context mContext; private int mNumStars =9; private float mRating =0; private boolean mIndicator; private float slidePosition; private int mType; /** * A callback that notifies clients when the rating has been changed. This * includes changes that were initiated by the user through a touch gesture * or arrow key/trackball as well as changes that were initiated * programmatically. */ public interface OnRatingBarChangeListener { /** * Notification that the rating has changed. Clients can use the * fromUser parameter to distinguish user-initiated changes from those * that occurred programmatically. This will not be called continuously * while the user is dragging, only when the user finalizes a rating by * lifting the touch. * * @param ratingBar The RatingBar whose rating has changed. * @param rating The current rating. This will be in the range * 0..numStars. * @param fromUser True if the rating change was initiated by a user's * touch gesture or arrow key/horizontal trackbell movement. */ void onRatingChanged(CustomRatingBar ratingBar, float rating, boolean fromUser); } private OnRatingBarChangeListener mOnRatingBarChangeListener; public CustomRatingBar(Context context) { this(context, null); } public CustomRatingBar(Context context, AttributeSet attrs) { this(context, attrs,0);//R.attr.coloredRatingBarStyle } public CustomRatingBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomRatingBar,defStyle, 0); final boolean indicator = a.getBoolean(R.styleable.CustomRatingBar_indicator, false); final float rating = a.getFloat(R.styleable.CustomRatingBar_setrating, -1); final int type = a.getInt(R.styleable.CustomRatingBar_type, 0); a.recycle(); setIndicator(indicator); setRating(rating); setType(type); init(context); } public int getType() { return mType; } public void setType(int type) { this.mType = type; } private void init(Context context) { mContext = context; Resources res = getResources(); if(mType==SMALL){ drawables = new Bitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)}; progressBackground = BitmapFactory.decodeResource(res, R.drawable.rating_inactive); }else{ drawables = new Bitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)}; progressBackground = BitmapFactory.decodeResource(res, R.drawable.rating_inactive); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //draw empty stars bg for(int i=0;i< mNumStars;i++){ drawStar(canvas,i); } } private void drawStar(Canvas canvas, int position) { float fraction = mRating -(position); Bitmap ratedStar1 = getRatedStar(); Paint paint=getPaint(position); int division=getSize(); Bitmap ratedStar=null; Bitmap emptyStar=null; if(!isInEditMode()){ ratedStar=Bitmap.createScaledBitmap(ratedStar1, division, division, false); emptyStar=Bitmap.createScaledBitmap(progressBackground, division, division, false); } if((position)< mRating){ if(!isInEditMode()){ canvas.drawBitmap(ratedStar,(position* division),0,paint); } } else{ if(!isInEditMode()){ canvas.drawBitmap(emptyStar,(position*division),0,null); } } } private int getSize(){ return (getWidth()/mNumStars); } private Bitmap getRatedStar() { if(mRating==0){ return drawables[0]; } else{ return drawables[1]; } } private Paint getPaint(int position){ int value=(255*(position+1))/mNumStars; String hexString=Integer.toHexString(value).equals("0")?"00":Integer.toHexString(value); String hexvalue="#"+hexString+"000000";//FEE98E //Log.e("TAG", position+"/"+value+"/"+hexvalue); Paint paint=new Paint(); paint.setColor(Color.parseColor(hexvalue)); return paint; } public int getNumStars() { return mNumStars; } public void setNumStars(int numStars) { this.mNumStars = numStars; } public float getRating() { return mRating; } public void setRating(float rating) { setRating(rating,false); } void setRating(float rating,boolean fromUser) { if(rating>mNumStars){ this.mRating = mNumStars; } this.mRating = rating; invalidate(); dispatchRatingChange(fromUser); } public boolean isIndicator() { return mIndicator; } public void setIndicator(boolean indicator) { this.mIndicator = indicator; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (progressBackground != null) { final int width = progressBackground.getWidth() * mNumStars; final int height = progressBackground.getHeight(); int widthSize = MeasureSpec.getSize(widthMeasureSpec); Bitmap emptyStar=Bitmap.createScaledBitmap(progressBackground, widthSize/mNumStars, widthSize/mNumStars, false); int heightSize = emptyStar.getHeight(); setMeasuredDimension(resolveSizeAndState(widthSize, widthMeasureSpec, 0), resolveSizeAndState(heightSize, heightMeasureSpec, 0)); } else{ int desiredWidth = 100; int desiredHeight = 50; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; //Measure Width if (widthMode == MeasureSpec.EXACTLY) { //Must be this size width = widthSize; } else if (widthMode == MeasureSpec.AT_MOST) { //Can't be bigger than... width = Math.min(desiredWidth, widthSize); } else { //Be whatever you want width = desiredWidth; } //Measure Height if (heightMode == MeasureSpec.EXACTLY) { //Must be this size height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { //Can't be bigger than... height = Math.min(desiredHeight, heightSize); } else { //Be whatever you want height = desiredHeight; } //MUST CALL THIS setMeasuredDimension(resolveSizeAndState(width, widthMeasureSpec, 0),resolveSizeAndState(height, heightMeasureSpec, 0)); } } @Override public boolean onTouchEvent(MotionEvent event) { if(mIndicator){ return false; } int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: slidePosition = getRelativePosition(event.getX()); int newRating = (int)(slidePosition>0?slidePosition+1:0) ; if(newRating>mNumStars){ newRating=mNumStars; } // Log.e("TAG", ""+newRating); if (newRating != mRating) { setRating(newRating,true); } break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } private float getRelativePosition(float x) { Bitmap emptyStar=Bitmap.createScaledBitmap(progressBackground, getWidth()/mNumStars, getWidth()/mNumStars, false); int widthSize = emptyStar.getWidth(); // Log.e("TAG", widthSize+"/"+x); float position = x / widthSize; position = Math.max(position, 0); return Math.min(position, mNumStars); } /** * Sets the listener to be called when the rating changes. * * @param listener The listener. */ public void setOnRatingBarChangeListener(OnRatingBarChangeListener listener) { mOnRatingBarChangeListener = listener; } /** * @return The listener (may be null) that is listening for rating change * events. */ public OnRatingBarChangeListener getOnRatingBarChangeListener() { return mOnRatingBarChangeListener; } void dispatchRatingChange(boolean fromUser) { if (mOnRatingBarChangeListener != null) { mOnRatingBarChangeListener.onRatingChanged(this, getRating(), fromUser); } } } 5) then in calling activity--- CustomRatingBar coloredRatingBar5=(CustomRatingBar)findViewById(R.id.coloredRatingBar5); coloredRatingBar5.setOnRatingBarChangeListener(new OnRatingBarChangeListener() { @Override public void onRatingChanged(CustomRatingBar ratingBar, float rating,boolean fromUser) { // TODO Auto-generated method stub Log.e("RATING", ""+rating); } }); 

6)评价积极—采取任何形象与深色因为它将被用作不同评级的颜色透明度

rating_inactive – 以浅色背景拍摄与上面的图像大小相同的任何图像。当未select评分时使用

更改星星边框颜色的一个非常简单的方法是使用xml参数:

 android:progressBackgroundTint="" 

在ratingBar视图中。 该值应该是一个颜色的hex代码。

我一直在寻找一种可靠的方法,至less可以完成API 9。 “铸造到LayerDrawble”解决scheme似乎对我来说是一个危险的解决scheme,当我在2.3的Android手机上testing它时,它已成功投入,但对DrawableCompat.setTint(…)的调用没有任何影响。

加载可绘制资产的需求似乎也不是一个好的解决scheme。

我决定编写我自己的解决scheme,这是一个扩展AppCompatRatingBar的类,使用自定义的Drawable来照顾程序化绘制星星。 它适合我的需求,我会张贴它的情况下,以帮助任何人:

https://gist.github.com/androidseb/2b8044c90a07c7a52b4bbff3453c8460

链接更容易,因为你可以直接获得完整的文件,但这里是完整的代码,以防万一:

 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Path; import android.graphics.PointF; import android.graphics.drawable.Drawable; import android.support.v7.widget.AppCompatRatingBar; import android.util.AttributeSet; /** * @author androidseb * <p/> * Extends AppCompatRatingBar with the ability to tint the drawn stars when selected, pressed and un-selected. * Limitation: Only draws full stars. */ public class TintableRatingBar extends AppCompatRatingBar { private TintableRatingBarProgressDrawable progressDrawable; public TintableRatingBar(final Context context) { super(context); init(); } public TintableRatingBar(final Context context, final AttributeSet attrs) { super(context, attrs); init(); } public TintableRatingBar(final Context context, final AttributeSet attrs, final int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { progressDrawable = new TintableRatingBarProgressDrawable(); setProgressDrawable(progressDrawable); } public void setCustomTintColors(final int _uncheckedColor, final int _pressedColor, final int _checkedColor) { progressDrawable.setRatingMaxLevelValue(getMax() * 1000); progressDrawable.setUnCheckedColor(_uncheckedColor); progressDrawable.setPressedColor(_pressedColor); progressDrawable.setCheckedColor(_checkedColor); invalidate(); } public class TintableRatingBarProgressDrawable extends Drawable { private static final int STAR_COUNT = 5; private static final int STAR_BRANCHES_COUNT = 5; /** Sets the max level value: if the level is at the max, then all stars are selected. */ private int ratingMaxLevelValue = 10000; /** Color to be painted for unselected stars */ private int uncheckedColor = Color.GRAY; /** Color to be painted for unselected stars when the ratingbar is pressed */ private int pressedColor = Color.CYAN; /** Color to be painted for selected stars */ private int checkedColor = Color.BLUE; @Override public void setAlpha(final int _i) { } @Override public void setColorFilter(final ColorFilter _colorFilter) { } @Override public boolean isStateful() { return true; } @Override public boolean setState(final int[] stateSet) { final boolean res = super.setState(stateSet); invalidateSelf(); return res; } @Override public int getOpacity() { return 255; } public void setRatingMaxLevelValue(final int _ratingMaxLevelValue) { ratingMaxLevelValue = _ratingMaxLevelValue; } public void setUnCheckedColor(final int _uncheckedColor) { uncheckedColor = _uncheckedColor; } public void setPressedColor(final int _pressedColor) { pressedColor = _pressedColor; } public void setCheckedColor(final int _checkedColor) { checkedColor = _checkedColor; } @Override public void draw(final Canvas _canvas) { boolean pressed = false; for (int i : getState()) { if (i == android.R.attr.state_pressed) { pressed = true; } } final int level = (int) Math.ceil(getLevel() / (double) ratingMaxLevelValue * STAR_COUNT); final int starRadius = Math.min(getBounds().bottom / 2, getBounds().right / STAR_COUNT / 2); for (int i = 0; i < STAR_COUNT; i++) { final int usedColor; if (level >= i + 1) { usedColor = checkedColor; } else if (pressed) { usedColor = pressedColor; } else { usedColor = uncheckedColor; } drawStar(_canvas, usedColor, (i * 2 + 1) * starRadius, getBounds().bottom / 2, starRadius, STAR_BRANCHES_COUNT); } } private void drawStar(final Canvas _canvas, final int _color, final float _centerX, final float _centerY, final float _radius, final int _branchesCount) { final double rotationAngle = Math.PI * 2 / _branchesCount; final double rotationAngleComplement = Math.PI / 2 - rotationAngle; //Calculating how much space is left between the bottom of the star and the bottom of the circle //In order to be able to center the star visually relatively to the square when drawn final float bottomOffset = (float) (_radius - _radius * Math.sin(rotationAngle / 2) / Math.tan( rotationAngle / 2)); final float actualCenterY = _centerY + (bottomOffset / 2); final Paint paint = new Paint(); paint.setColor(_color); paint.setStyle(Style.FILL); final Path path = new Path(); final float relativeY = (float) (_radius - _radius * (1 - Math.sin(rotationAngleComplement))); final float relativeX = (float) (Math.tan(rotationAngle / 2) * relativeY); final PointF a = new PointF(-relativeX, -relativeY); final PointF b = new PointF(0, -_radius); final PointF c = new PointF(relativeX, -relativeY); path.moveTo(_centerX + ax, actualCenterY + ay); _canvas.save(); for (int i = 0; i < _branchesCount; i++) { path.lineTo(_centerX + bx, actualCenterY + by); path.lineTo(_centerX + cx, actualCenterY + cy); rotationToCenter(b, rotationAngle); rotationToCenter(c, rotationAngle); } _canvas.drawPath(path, paint); _canvas.restore(); } private void rotationToCenter(final PointF _point, final double _angleRadian) { final float x = (float) (_point.x * Math.cos(_angleRadian) - _point.y * Math.sin(_angleRadian)); final float y = (float) (_point.x * Math.sin(_angleRadian) + _point.y * Math.cos(_angleRadian)); _point.x = x; _point.y = y; } } } 

有点晚回答,但我希望它会帮助一些人。

 <RatingBar android:id="@+id/rating" style="@style/Base.Widget.AppCompat.RatingBar.Small" android:theme="@style/WhiteRatingStar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/profil_name" android:layout_centerHorizontal="true" android:layout_marginLeft="@dimen/dimen_4" android:rating="3" /> 

这里是WhiteRatingStar的样子

 <style name="WhiteRatingStar" parent="Base.Widget.AppCompat.RatingBar.Small"> <item name="colorAccent">@android:color/white</item> </style> 

With this the stars will be coloured in white for example.

The simpliest way:

 android:progressTint="@color/color" 

Just edit or add

 <color name="colorAccent">#3b71c7</color> 

in your resource value folder

As the previous answer implies, it is not easy to change the color of the ratingbar. The stars are not programmatically drawn, they are images with fixed size and specific color gradients. To change the color you have to create your own star images with different colors then proceed to create your own drawable XML resource and pass it to the ratingsBar class using setProgressDrawable(Drawable d) or XML attribute android:progressDrawable.

The rating bar is used automatically at run time for change color on touch star.

First add style in app\src\main\res\values\styles.xml file:

 <style name="RatingBar" parent="Theme.AppCompat"> <item name="colorControlNormal">@android:color/darker_gray</item> <item name="colorControlActivated">@color/com_facebook_blue</item> </style> 

Then your rating bar add theme like this:

 <RatingBar android:id="@+id/rating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numStars="5" android:stepSize="1" android:theme="@style/RatingBar"/>