代码之家  ›  专栏  ›  技术社区  ›  d-man

Android分级栏更改星形颜色[关闭]

  •  132
  • d-man  · 技术社区  · 14 年前

    我怎样才能改变星星的颜色,怎样才能改变星星的大小?

    31 回复  |  直到 5 年前
        1
  •  25
  •   CommonsWare    14 年前

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

    第二步:创建自己的 LayerDrawable 的XML资源 RatingBar ,指向要用于栏的适当图像。原始样式将指向可与之比较的现有资源。然后,调整你的风格以使用你自己的 可分层拉伸 资源,而不是内置资源。

        2
  •  119
  •   DiscDev    11 年前

    上面提到的博客有点复杂,我用了一种类似但简单的方式。 您需要3星图像(red_star_full.png、red_star_half.png和red_star_empty.png)和一个XML。

    把这3张图片放在分辨率/可绘制的位置。

    将下面的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"/>
    

    就这样。

        3
  •  90
  •   Mirek Michalak    11 年前

    如果只想更改颜色,请尝试此操作:

    RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar);
    LayerDrawable stars = (LayerDrawable) ratingBar.getProgressDrawable();
    stars.getDrawable(2).setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP);
    
        4
  •  59
  •   Vishal Kumar    8 年前

    对我来说最简单的方法……如果您要扩展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  
        android:theme="@style/RatingBar"
        android:rating="3"
        android:stepSize="0.5"
        android:numStars="5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    
        5
  •  47
  •   lgvalle    9 年前

    2015年更新

    现在你可以使用 DrawableCompat 给各种抽屉上色。例如:

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

    这是向后兼容的API 4

        6
  •  34
  •   Ziem    9 年前

    如果你想改变所有星星的颜色,我会用:

    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);
    
        7
  •  31
  •   superpuccio Kasra    5 年前

    来自API 21 用这三行代码很容易改变星星的颜色:

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

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

        8
  •  25
  •   YoungDinosaur    11 年前

    Alex和Commonware发布的解决方案是正确的。不过,有一件事是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
    
        9
  •  23
  •   box    8 年前

    因此,我已经花了两个小时来解决这个问题,并且我已经为所有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);
        }
    }
    

    您可以使用以下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));
    

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

        10
  •  12
  •   Dan Dar3 Stefan Haberl    9 年前

    现在你可以使用 DrawableCompat 从AppCompat v22.1.0到动态着色所有类型的可绘制文件,当您用一组可绘制文件支持多个主题时非常有用。例如:

    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

    对于实际的大小和形状,您需要为适当的大小定义一个新的样式和图层列表抽屉,因为其他人已经在上面回答过。

        11
  •  10
  •   hidro    9 年前

    使用 android:theme 属性:

    样式.xml

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

    布局.xml

    <android.support.v7.widget.AppCompatRatingBar
        android:theme="@style/Theme.Rating"
        android:numStars="5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
        12
  •  9
  •   Rahul    9 年前

    只需从XML更改分级栏的颜色:

    android:progressTint="@color/your_color"
    android:backgroundTint="@color/your_color"
    android:secondaryProgressTint="@color/your_color"
    
        13
  •  7
  •   letrounet    9 年前

    要更改颜色,只需设置参数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"
           />
    

    样式属性的大小。

        14
  •  5
  •   Mehatab    7 年前

    最简单的方法:

    android:progressTint="@color/color"
    
        15
  •  4
  •   splangi    9 年前

    正在生成@lgvalle的答案。

    2015年更新

    现在您可以使用drawablecompat对所有类型的drawables进行着色。例如:

    drawable progress=ratingbar.getProgressDrawable(); drawablecompat.settint(进度,颜色,白色); 这是向后兼容的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));
    

    这将保留分数步颜色。

        16
  •  4
  •   Sibasish Milon    8 年前
    <!--For rating bar -->
        <style name="RatingBarfeed" parent="Theme.AppCompat">
            <item name="colorControlNormal">@color/colorPrimary</item>
            <item name="colorControlActivated">@color/colorPrimary</item>
        </style>
    

    使用你自己的颜色

        17
  •  4
  •   4ndro1d    7 年前

    添加新样式后,可以在 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"/>
    
        18
  •  3
  •   Arbitur    7 年前

    适用于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
    
        19
  •  3
  •   Kuldeep Sakhiya    6 年前

    简单的解决方案,使用 应用兼容栏 和它的 设置进度列表 实现这一点的方法,请参见 answer 供参考。

        20
  •  2
  •   gengisdave    9 年前

    我通过以下方式解决了这个问题:

    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);
    
        21
  •  2
  •   Vimesh Pk    8 年前
    RatingBar mRating=(RatingBar)findViewById(R.id.rating);
     LayerDrawable layerDrawable=(LayerDrawable)mRating.getProgressDrawable();
     layerDrawable.getDrawable(2).setColorFilter(Color.parseColor
     ("#32CD32"),    PorterDuff.Mode.SRC_ATOP);
    

    对我来说,它起作用了……

        22
  •  1
  •   Hardik4560    9 年前

    我找到了一个简单的方法,可以根据你的主题改变星星的颜色。

    转到此网站: http://android-holo-colors.com/

    选择你的主题颜色并创建你的明星图片。

        23
  •  1
  •   JDenais    9 年前

    使用上面的答案,我创建了一个快速静态方法,可以很容易地重用。它只是为了给被激活的恒星着色。没有被激活的恒星仍然是灰色的。

        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,我使用superpuccio解决方案。

        24
  •  0
  •   amit    9 年前

    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(不活动)--用浅色背景拍摄与上述图像大小相同的任何图像。如果未选择任何分级,则将使用该图像。

        25
  •  0
  •   Pau Arlandis Martinez    9 年前

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

    android:progressBackgroundTint=""
    

    在RatingBar视图中。该值应该是颜色的十六进制代码。

        26
  •  0
  •   androidseb    8 年前

    我一直在寻找一种可靠的方法来实现这一点,至少一直到API 9。 “强制转换为分层可拖动”解决方案对我来说似乎是一个危险的解决方案,当我在2.3版的Android手机上测试它时,它成功地强制转换了,但是对drawablecompat.settint(…)的调用没有任何效果。

    装载可提取资产的需求对我来说也不是一个好的解决方案。

    我决定编写自己的解决方案代码,这是一个扩展AppCompatingBar的类,使用一个自定义的可绘制工具,以编程方式绘制星星。它非常适合我的需要,我会张贴它以防它帮助任何人:

    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 + 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;
            }
        }
    }
    
        27
  •  0
  •   Martial Konvi    7 年前

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

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

    这是怀特兰廷斯塔的样子

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

    例如,有了它,星星就会变成白色。

        28
  •  0
  •   Navadip Patel    7 年前

    运行时自动使用分级栏更改触摸星上的颜色。

    首先在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"/>
    
        29
  •  0
  •   Jatin Bansal    6 年前

    使用此链接

    Android RatingBar change star colors

    在值/样式(V-21)内设置您的样式;

        30
  •  -1
  •   David    14 年前

    正如前面的答案所暗示的,改变评级栏的颜色并不容易。恒星不是程序化绘制的,它们是具有固定大小和特定颜色梯度的图像。要更改颜色,您必须使用不同的颜色创建自己的星型图像,然后继续创建自己的可绘制XML资源,并使用setProgressDrawable(drawable d)或xml属性android:progressDrawable将其传递到RatingsBar类。