web-dev-qa-db-ja.com

Android RatingBarの星の色の変更

星の色と星のサイズを変更するにはどうすればよいですか?

137
d-man

ステップ#1:既存のスタイルの1つを($Android_HOME/platforms/$SDK/data/res/values/styles.xmlから)複製し、それを独自のプロジェクトのstyles.xmlに入れ、ウィジェットをレイアウトに追加するときに参照することにより、独自のスタイルを作成します。

ステップ#2:LayerDrawable用の独自のRatingBar XMLリソースを作成し、バーに使用する適切な画像を指定します。元のスタイルは、比較可能な既存のリソースを示します。次に、組み込みリソースではなく、独自のLayerDrawableリソースを使用するようにスタイルを調整します。

25
CommonsWare

言及されたブログでは少し複雑です。私は似ていますが、よりシンプルな方法を使用しました。 3つの星の画像(red_star_full.png、red_star_half.png、red_star_empty.png)と1つの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"/>

それでおしまい。

119
Alex

色のみを変更したい場合は、これを試してください:

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

私のために働いた最も簡単な方法... AppCompatアクティビティを拡張する場合

Build.gradleに最新のappcompatライブラリを追加します。

dependencies {  
    compile 'com.Android.support:appcompat-v7:X.X.X' // where X.X.X 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"/>
66
Vishal Kumar

2015アップデート

DrawableCompat を使用して、あらゆる種類のドロウアブルに色を付けることができます。例えば:

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

これはAPI 4まで後方互換性があります

46
lgvalle

API 21よりで、次の3行のコードで星の色を簡単に変更できます。

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

このようにして、変更します:

  • 塗りつぶされた星の色(progressTint)
  • 塗りつぶされていない星の色(progressBackgroundTint)
  • 星の境界線の色(secondaryProgressTint)
35
superpuccio

すべての星の色を変更したい場合は、私の使用を示します:

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

AlexとCommonsWaresが投稿したソリューションは正しいです。 Androidが決して語らないことの1つは、さまざまな密度に対する適切なピクセルサイズです。ハロー光に基づく各密度に必要な寸法は次のとおりです。

小星

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

中星

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

大スター

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

そのため、私はこの問題に2時間苦労しており、すべてのAPIバージョンで機能するソリューションを考案しました。

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」を指定する必要があります。指定しない場合、半星は表示されません。

23
box

これで、AppCompat v22.1.0以降の DrawableCompat を使用して、すべての種類のドロウアブルを動的に色付けできます。これは、1組のドロウアブルで複数のテーマをサポートする場合に便利です。例えば:

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まで下位互換性があります。ChrisBanesのブログ投稿 Support Libraries v22.1. も参照してください。

実際のサイズと形状については、適切なサイズの新しいスタイルとレイヤーリストのドロアブルを定義する必要があります。他の人はすでに上記で回答しています。

12
Dan Dar3

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

評価バーの色をxmlから変更するだけの場合:-

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

色を変更するには、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"
       />

サイズのスタイルプロパティ。

7
letrounet

最も簡単な方法:

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>

自分の色を使う

4
Sibasish

新しいスタイルを追加せずに、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

@lgvalleの答えを作成します。

2015アップデート

これで、DrawableCompatを使用して、あらゆる種類のドロウアブルに色を付けることができます。例えば:

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

これにより、分数ステップの色が維持されます。

4
splangi

シンプルなソリューション、AppCompatRatingBarおよびそのsetProgressTintListメソッドを使用して、これを達成しますこれ answer 参照用。

3
Kuldeep Sakhiya

バージョン21以降のAndroidで動作します

いくつかの調査の後、背景の色合い、ギャップの色合い(例:半星)、星の色合いの色を設定するこの方法を思いつきました。

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

私にとっては…。

2
Vimesh Pk

この問題を次のように解決します。

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

テーマに応じて星の色を変える簡単な解決策を見つけました。

このサイトにアクセスしてください: http://Android-holo-colors.com/

テーマの色を選択して、スター画像を作成します。

1
Hardik4560

上記の回答を使用して、簡単に再利用できる簡単な静的メソッドを作成しました。活性化された星の進行色を着色することのみを目的としています。アクティブ化されていない星は灰色のままです。

    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ソリューションを使用します。

1
JDenais

評価バーは、実行時にタッチスターの色を変更するために自動的に使用されます。

最初に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>

次に、評価バーに次のようなテーマを追加します。

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

少し遅い答えですが、私はそれが一部の人々を助けることを願っています。

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

これにより、星は例えば白で色付けされます。

0
Martial Konvi

少なくともAPI 9まではこれを行うための信頼できる方法を探していました。 「LayerDrawbleへのキャスト」ソリューションは私にとって危険なソリューションのように見え、2.3のAndroid電話でテストしたところ、正常にキャストされましたが、DrawableCompat.setTint(...)の呼び出しは効果はありません。

ドロアブルアセットをロードする必要も、私にとっては良い解決策とは思えませんでした。

プログラムで星を描画するカスタムDrawableを使用して、AppCompatRatingBarを拡張するクラスである独自のソリューションをコーディングすることにしました。それは私のニーズに完璧に機能します。誰にも役立つ場合に備えて投稿します:

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

完全なファイルを直接取得できるため、リンクは簡単ですが、念のため完全なコードを次に示します。

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)この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--上記の画像と同じサイズの画像を明るい背景で撮影します。評価が選択されていない場合に使用されます

0
amit

星の境界線の色を変更する非常に簡単な方法は、xmlパラメーターを使用することです。

Android:progressBackgroundTint=""

ratingBarビューで。値は色の16進コードである必要があります。

このリンクを使用します

Android RatingBarの星の色の変更

value/style(v-21)内にスタイルを設定します。

0
Jatin Bansal