web-dev-qa-db-fra.com

Android RatingBar change les couleurs des étoiles

Comment puis-je changer les couleurs des étoiles et comment puis-je changer la taille des étoiles?

132
d-man

Étape n ° 1: Créez votre propre style en clonant l'un des styles existants (à partir de $Android_HOME/platforms/$SDK/data/res/values/styles.xml), en le mettant dans le styles.xml de votre propre projet et en le référençant lorsque vous ajoutez le widget à une présentation.

Étape n ° 2: Créez vos propres ressources XML LayerDrawable pour la RatingBar, en pointant sur les images appropriées à utiliser pour la barre. Les styles originaux vous indiqueront les ressources existantes avec lesquelles vous pouvez comparer. Ensuite, ajustez votre style pour utiliser vos propres ressources LayerDrawable, plutôt que celles intégrées.

25
CommonsWare

C'est un peu compliqué sur le blog mentionné, j'ai utilisé une méthode similaire mais plus simple . Vous avez besoin d'images 3 étoiles (red_star_full.png, red_star_half.png et red_star_empty.png) et d'un xml, c'est tout.

Mettez ces 3 images à res/drawable.

Mettez-y le ratingbar_red.xml suivant:

<?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>

et, enfin, indiquez à votre définition de la barre d’évaluation de l’utiliser, c.-à-d.

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

C'est tout.

119
Alex

Essayez ceci si vous voulez seulement changer de couleur:

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

La manière la plus simple qui a fonctionné pour moi ... si vous étendez AppCompat Activity

Dans votre build.gradle, ajoutez la dernière bibliothèque appcompat.

dependencies {  
    compile 'com.Android.support:appcompat-v7:X.X.X' // where X.X.X version
}

Faites en sorte que votre activité étende Android.support.v7.app.AppCompatActivity

public class MainActivity extends AppCompatActivity {  
    ...
}

Déclarez le style personnalisé dans votre fichier styles.xml.

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

Appliquez ce style à votre RatingBar via Android: attribut de thème.

<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"/>
59
Vishal Kumar

Mise à jour 2015

Vous pouvez maintenant utiliser DrawableCompat pour colorer tout type de dessinable. Par exemple:

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

Ceci est rétro-compatible jusqu'à API 4

47
lgvalle

Si vous voulez changer de couleur pour toutes les étoiles, vous devez utiliser:

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);
34
Yuriy Vinogradov

Depuis l'API 21 il est très facile de changer la couleur des étoiles avec ces trois lignes de code:

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

En procédant ainsi, vous allez changer la couleur de fond et la couleur de bordure des étoiles.

30
superpuccio

Les solutions publiées par Alex et CommonsWares sont correctes. Une chose dont l’Android ne parle jamais est la taille de pixel appropriée pour différentes densités. Voici les dimensions requises pour chaque densité en fonction du halo.

Petite étoile

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

Étoile moyenne

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

Grande étoile

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

Je suis donc aux prises avec ce problème depuis deux heures et j'ai mis au point une solution opérationnelle pour toutes les versions d'API, où les notes demi-étoile sont également affichées.

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);
    }
}

Vous appelez la méthode avec cet ordre de drawables:

    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));

REMARQUE: vous devez également spécifier les attributs "max" et "numStars" dans XML, sinon les demi-étoiles ne sont pas affichées.

23
box

Vous pouvez maintenant utiliser DrawableCompat à partir d’AppCompat v22.1.0 et par la suite pour colorer de manière dynamique tout type de dessins, ce qui est utile lorsque vous supportez plusieurs thèmes avec un seul ensemble de dessins. Par exemple:

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

Ceci est rétrocompatible avec l’API 4. Voir aussi le billet de blog de Chris Banes sur Support Libraries v22.1.0

Pour la taille et la forme réelles, vous devrez définir un nouveau style et une nouvelle liste de calques pouvant être dessinés pour la taille appropriée, comme d'autres l'ont déjà indiqué ci-dessus.

12
Dan Dar3

Utilisez l'attribut 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" />
10
hidro

Pour changer simplement la couleur de la barre d'évaluation de xml: -

Android:progressTint="@color/your_color"
Android:backgroundTint="@color/your_color"
Android:secondaryProgressTint="@color/your_color"
9
Rahul

Pour changer la couleur, il suffit de définir le paramètre 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"
       />

Pour la taille de la propriété de style.

7
letrounet

Le moyen le plus simple:

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

utilise ta propre couleur

4
Sibasish

Sans ajouter de nouveau style, vous pouvez utiliser la couleur de teinte dans la variable 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"/>
4
4ndro1d

La réponse de Building @ lgvalle. 

Mise à jour 2015

Vous pouvez maintenant utiliser DrawableCompat pour colorer tout type de dessin. Par exemple:

Progression tirable = ratingBar.getProgressDrawable (); DrawableCompat.setTint (progress, Color.WHITE); Ceci est rétro-compatible jusqu'à 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));

Cela gardera les fractions de couleurs.

4
splangi

Fonctionne pour Android ci-dessous et ci-dessus version 21

Après quelques recherches, j'ai trouvé cette méthode pour définir la teinte de fond, la teinte gap (ex: demi-étoile) et la couleur de teinte étoile.

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
3
Arbitur
RatingBar mRating=(RatingBar)findViewById(R.id.rating);
 LayerDrawable layerDrawable=(LayerDrawable)mRating.getProgressDrawable();
 layerDrawable.getDrawable(2).setColorFilter(Color.parseColor
 ("#32CD32"),    PorterDuff.Mode.SRC_ATOP);

pour moi ça marche ....

2
Vimesh Pk

Solution simple, utilisez AppCompatRatingBar et sa méthode setProgressTintList pour obtenir cela, consultez ceci réponse pour référence.

2
Kuldeep Sakhiya

Je résous ce problème comme suit:

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);
2
Hai Rom

J'ai trouvé une solution simple pour changer la couleur de l'étoile en fonction de votre thème.

Allez sur ce site: http://Android-holo-colors.com/

Choisissez votre couleur de thème et obtenez vos images étoiles créées.

1
Hardik4560

En utilisant les réponses ci-dessus, j'ai créé une méthode statique rapide qui peut facilement être réutilisée. Il ne vise qu'à teinter la couleur de progression pour les étoiles activées. Les étoiles non activées restent grises.

    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;
    }
}

Il suffit de passer votre barre d’évaluation et une couleur en utilisant getResources().getColor(R.color.my_rating_color)

Comme vous pouvez le constater, j'utilise DrawableCompat pour qu'il soit compatible avec les versions antérieures.

EDIT: Cette méthode ne fonctionne pas sur API21 (voir pourquoi). Vous vous retrouvez avec une exception NullPointerException lorsque vous appelez setProgressBar. J'ai fini par désactiver toute la méthode sur l'API> = 21. 

Pour les API> = 21, j'utilise la solution SupperPuccio.

1
JDenais

Réponse un peu tardive, mais j'espère que cela aidera certaines personnes.

<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" />

Et voici à quoi ressemble le WhiteRatingStar

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

Avec cela, les étoiles seront colorées en blanc par exemple.

0
Martial Konvi

Je cherchais une méthode fiable pour le faire jusqu'à l'API 9 au moins… .. La solution "casting vers LayerDrawble" me paraissait une solution risquée, et lorsque je l'ai testée sur un téléphone Android le 2.3. , la conversion a réussi mais l’appel de DrawableCompat.setTint (...) n’a eu aucun effet.

La nécessité de charger des ressources pouvant être tirées ne me semblait pas non plus être une bonne solution.

J'ai décidé de coder ma propre solution, qui est une classe qui étend AppCompatRatingBar, en utilisant un Drawable personnalisé prenant soin de dessiner les étoiles par programme. Cela fonctionne parfaitement pour mes besoins, je le posterai au cas où cela aiderait quelqu'un:

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

Le lien est plus facile car vous pouvez obtenir le fichier complet directement, mais voici le code complet au cas où:

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 + a.x, actualCenterY + a.y);
            _canvas.save();
            for (int i = 0; i < _branchesCount; i++) {
                path.lineTo(_centerX + b.x, actualCenterY + b.y);
                path.lineTo(_centerX + c.x, actualCenterY + c.y);
                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;
        }
    }
}
0
androidseb

1) déclarer ce 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) dans 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) évaluation active --- prendre une image avec une couleur sombre car elle sera utilisée comme transparence de couleur pour une évaluation différente

rating_inactive - prend n'importe quelle image de la même taille que l'image ci-dessus avec un fond clair ... elle sera utilisée quand aucune note n'est sélectionnée

0
amit

Un moyen très simple de changer la couleur de la bordure des étoiles est d'utiliser le paramètre xml:

Android:progressBackgroundTint=""

dans la vue ratingBar. La valeur doit être un code hexadécimal pour une couleur.

0

Utilisez ce lien

Android RatingBar changer les couleurs des étoiles

définissez votre style dans value/style (v-21);

0
Jatin Bansal

La barre d’évaluation est utilisée automatiquement au moment de l’exécution pour changer de couleur sur l’étoile tactile.

Commencez par ajouter le style dans le fichier app\src\main\res\values ​​\ styles.xml:

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

Ensuite, votre barre de notation ajoute un thème comme celui-ci:

<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"/>
0
Navadip Patel