Esperaba que esta pregunta sea para la barra de calificación multicolor como se muestra en los sitios web, no pude encontrar una para mí. Creé una implementación simple yo mismo github.com/codebreaker/coloredratingbar-android . Espero que esto ayude a alguien por ahí.
jaga
Respuestas:
26
Paso # 1: Cree su propio estilo, clonando uno de los estilos existentes (desde $ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml), colocándolo en su propio proyecto styles.xmly haciendo referencia a él cuando agregue el widget a un diseño.
Paso # 2: Cree sus propios LayerDrawablerecursos XML para RatingBar, señalando las imágenes apropiadas para usar en la barra. Los estilos originales le indicarán los recursos existentes con los que puede comparar. Luego, ajuste su estilo para usar sus propios LayerDrawablerecursos, en lugar de los incorporados.
Según el paso 2, esto no funciona para dispositivos Samsung 3 u otros, no es necesario que sea un LayerDrawable. Consulte aquí para obtener información: stackoverflow.com/questions/30266334/…
Kenny
66
Use android: progressTint = "@ color / yellow". Ver la respuesta de @superpuccio.
Vincent
2
progressTint solo se admite por encima del nivel 21 de la API
Es un poco complicado en el blog mencionado, he usado una forma similar pero más simple. Necesita 3 imágenes de estrellas (red_star_full.png, red_star_half.png y red_star_empty.png) y una xml, eso es todo.
Hola Alex, probé esta solución, pero cuando trato de establecer la calificación en algo así como 1.1, 1.2, etc., se muestra como 1.5. He tomado imágenes de 3 estrellas, una vacía, la mitad llena y la otra llena. Supongo que se supone que debe interpolar entre ellos para obtener los componentes fraccionales, me pregunto si alguien más ha tenido el mismo problema o estoy haciendo algo notablemente mal.
Graham Baitson
¿Me puede decir acerca de las imágenes que deberíamos usar si las imágenes son de color y el tamaño de las imágenes no puedo resolver esto ...
Prithviraj Shiroor
1
¡Todos ven la respuesta de la actualización de 2015 a continuación! ¡Es mucho más fácil y sencillo!
Katie
Esta respuesta aún proporciona más flexibilidad sobre los diferentes estados de las estrellas.
Tom Brinkkemper
¿Por qué obtengo líneas verticales debajo de las estrellas? Intenté definir un estilo personalizado, especificando la altura, pero todavía hay líneas verticales debajo de las estrellas en mi AVD.
¿Qué PorterDuff.Mode.SRC_ATOPsignifica exactamente o qué hace?
Zapnologica
55
No funciona en API 5.0 y versiones posteriores. Necesidades:Drawable stars = rb.getProgressDrawable(); stars.setTint( Color.YELLOW );
zyamys
@zyamys Esto realmente apesta = (¿Es necesario un método para "versiones superiores" y otro método para versiones anteriores?
Daniela Morais
1
Solo funciona para una precisión de 0.5. De lo contrario (precisión <0.5), la superposición se vuelve extraña y parece que el color azul todavía tiene una precisión de 0.5 mientras que el amarillo es preciso
Teo Inke
1
Advertencia: se bloquea en dispositivos pre-lolipop. Ve con la respuesta aceptada.
blockwala
70
La forma más fácil que funcionó para mí ... si está extendiendo la actividad de AppCompat
En su build.gradle agregue la última biblioteca de appcompat.
dependencies {
compile 'com.android.support:appcompat-v7:X.X.X'// where X.X.X version}
Haga que su actividad se extienda android.support.v7.app.AppCompatActivity
Gracias @Vishal Kumar. Lo probé en Kitkat 4.4.4 (Samsung S3 neo) y Marshmallow 6.0.1 (Samsung Galaxy On Nxt), funcionó. Pero no hubo éxito en Lollipop 5.1 (Micromax). Para Lollipop, utilicé el atributo "android: progressTint" en RatingBar y sí, funciona.
Prashant
Esa es la mejor solución.
Arhat Baid
Esta debería ser la respuesta correcta seleccionada.
Hampel Előd
1
Esta es la mejor solución. Si desea cambiar el tamaño de la estrella, pueden usarlo style="?android:ratingBarStyleSmall"juntos.
André Luiz Reis
@ AndréLuizReis <style name="RatingBarSmallTheme" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/colorOrangeNormal</item> <item name="colorControlActivated">@color/colorOrangeActivated</item> <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar.Small</item> </style> y tu calificación Bar android:theme="@style/RatingBarSmallTheme"
Zakhar Rodionov
47
Actualización 2015
Ahora puede usar DrawableCompat para teñir todo tipo de elementos dibujables. Por ejemplo:
¿Hay alguna forma de establecer el color de las estrellas en función de los datos obtenidos de la base de datos? Digamos que obtuve 5 estrellas y los datos devueltos de la base de datos fueron 4. Entonces, en lugar de cambiar los 5, solo cambio los primeros 4
1
getColor está en desuso ahora, ¿alguna alternativa?
Manohar Reddy
2
Puede encontrar respuestas aquí stackoverflow.com/a/32202256/2513291 Por ejemplo, este enfoque ContextCompat.getColor (contexto, R.color.color_name)
Yuriy Vinogradov
funciona bien, pero tenga en cuenta que, por alguna razón, el orden es importante (2, luego 1, luego 0). Intenté lo contrario y provocó algunos problemas de interfaz de usuario la primera vez que se cambió el color.
Simon Ninon
25
Las soluciones que Alex y CommonsWares han publicado son correctas. Sin embargo, una cosa de la que Android nunca habla es el tamaño de píxeles adecuado para diferentes densidades. Aquí están las dimensiones requeridas para cada densidad basada en halo de luz.
Así que he estado luchando con este problema durante dos horas y he encontrado una solución de trabajo para todas las versiones de API, donde también se muestran las calificaciones de media estrella.
la única forma que funciona para mí en API19, pero no me he rendido a buscar una manera de hacerlo solo desde xml T_T
Beeing Jk
@BeeingJk si crea una vista personalizada que extiende RatingBar, puede crear sus propios atributos xml para especificar el color del tinte. Luego tiene un único punto de control para configurar el tinte y puede especificar el tinte en xml. ¡Espero que ayude! Puede explicar más si es necesario
Forrest Bice
Mode.SRC_INo Mode.MULTIPLY?
Dr.jacky
12
Ahora puede usar DrawableCompat desde AppCompat v22.1.0 en adelante para teñir dinámicamente todo tipo de elementos dibujables, útil cuando admite varios temas con un solo conjunto de elementos dibujables. Por ejemplo:
LayerDrawable layerDrawable =(LayerDrawable) ratingBar.getProgressDrawable();DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(0)),Color.RED);// Empty starDrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(1)),Color.GREEN);// Partial starDrawableCompat.setTint(DrawableCompat.wrap(layerDrawable.getDrawable(2)),Color.BLUE);// Full star
Esto es compatible con versiones anteriores hasta API 4. Consulte también la publicación de blog de Chris Banes en Support Libraries v22.1.0
Para el tamaño y la forma reales, deberá definir un nuevo estilo y una lista de capas dibujables para el tamaño apropiado, ya que otros ya han respondido anteriormente.
Tenga en cuenta que esto solo funciona en la API 21+
Ixx
4
Construyendo la respuesta de @ lgvalle.
Actualización 2015
Ahora puede usar DrawableCompat para teñir todo tipo de elementos dibujables. Por ejemplo:
Progreso dibujable = ratingBar.getProgressDrawable (); DrawableCompat.setTint (progreso, Color.WHITE); Esto es compatible con versiones anteriores hasta API 4
Funciona para Android por debajo y por encima de la versión 21
Después de algunas investigaciones, se me ocurrió este método para establecer el tinte de fondo, el tinte de separación (por ejemplo, media estrella) y el color del tinte de estrella.
LayerDrawable layers =(LayerDrawable) ratingBar.getProgressDrawable();DrawableCompat.setTint(layers.getDrawable(0),0x33000000);// The background tintDrawableCompat.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
Usando las respuestas anteriores, creé un método estático rápido que puede reutilizarse fácilmente. Solo tiene como objetivo teñir el color de progreso de las estrellas activadas. Las estrellas que no están activadas permanecen grises.
Simplemente pase su barra de calificación y un Color usando getResources().getColor(R.color.my_rating_color)
Como puede ver, uso DrawableCompat para que sea compatible con versiones anteriores.
EDITAR: Este método no funciona en API21 (ve por qué). Terminas con una NullPointerException cuando llamas a setProgressBar. Terminé deshabilitando todo el método en API> = 21.
java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperHoneycomb no se puede
enviar
1
@IshaanGarg tienes razón. Me encontré con el mismo problema y actualicé mi método. Actualicé mi código para manejar el caso. No creo que sea una versión de Android. Si usa la versión más pequeña de la barra de calificación (con style = "? Android: attr / ratingBarStyleSmall"), el elemento extraíble sigue siendo un LayoutDrawable.
JDenais
Sí, justo lo que había implementado, solo asegúrese de usar AppCompatRatingBar. Aunque no puedo obtener media estrella cuando preselecciono la calificación de XML / java. Como setRating (3.5) muestra 4 estrellas completas
Ishaan Garg
1
La barra de clasificación se usa automáticamente en tiempo de ejecución para cambiar el color en la estrella táctil.
Primero agregue estilo en el archivo app \ src \ main \ res \ values \ styles.xml:
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;publicclassCustomRatingBarextendsView{privatestaticfinalString TAG="ColoredRatingBar";privatestaticfinalint NORMAL =0;privatestaticfinalint SMALL =1;Bitmap[] drawables;Bitmap progressBackground;Context mContext;privateint mNumStars =9;privatefloat mRating =0;privateboolean mIndicator;privatefloat slidePosition;privateint 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.
*/publicinterfaceOnRatingBarChangeListener{/**
* 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);}privateOnRatingBarChangeListener mOnRatingBarChangeListener;publicCustomRatingBar(Context context){this(context,null);}publicCustomRatingBar(Context context,AttributeSet attrs){this(context, attrs,0);//R.attr.coloredRatingBarStyle}publicCustomRatingBar(Context context,AttributeSet attrs,int defStyle){super(context, attrs, defStyle);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomRatingBar,defStyle,0);finalboolean indicator = a.getBoolean(R.styleable.CustomRatingBar_indicator,false);finalfloat rating = a.getFloat(R.styleable.CustomRatingBar_setrating,-1);finalint type = a.getInt(R.styleable.CustomRatingBar_type,0);
a.recycle();
setIndicator(indicator);
setRating(rating);
setType(type);
init(context);}publicint getType(){return mType;}publicvoid setType(int type){this.mType = type;}privatevoid init(Context context){
mContext = context;Resources res = getResources();if(mType==SMALL){
drawables =newBitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)};
progressBackground =BitmapFactory.decodeResource(res, R.drawable.rating_inactive);}else{
drawables =newBitmap[]{BitmapFactory.decodeResource(res, R.drawable.rating_inactive),BitmapFactory.decodeResource(res, R.drawable.rating_active)};
progressBackground =BitmapFactory.decodeResource(res, R.drawable.rating_inactive);}}@Overrideprotectedvoid onDraw(Canvas canvas){super.onDraw(canvas);//draw empty stars bgfor(int i=0;i< mNumStars;i++){
drawStar(canvas,i);}}privatevoid 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);}}}privateint getSize(){return(getWidth()/mNumStars);}privateBitmap getRatedStar(){if(mRating==0){return drawables[0];}else{return drawables[1];}}privatePaint getPaint(int position){intvalue=(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=newPaint();
paint.setColor(Color.parseColor(hexvalue));return paint;}publicint getNumStars(){return mNumStars;}publicvoid setNumStars(int numStars){this.mNumStars = numStars;}publicfloat getRating(){return mRating;}publicvoid setRating(float rating){
setRating(rating,false);}void setRating(float rating,boolean fromUser){if(rating>mNumStars){this.mRating = mNumStars;}this.mRating = rating;
invalidate();
dispatchRatingChange(fromUser);}publicboolean isIndicator(){return mIndicator;}publicvoid setIndicator(boolean indicator){this.mIndicator = indicator;}@Overrideprotectedvoid onMeasure(int widthMeasureSpec,int heightMeasureSpec){super.onMeasure(widthMeasureSpec, heightMeasureSpec);if(progressBackground !=null){finalint width = progressBackground.getWidth()* mNumStars;finalint 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 Widthif(widthMode ==MeasureSpec.EXACTLY){//Must be this size
width = widthSize;}elseif(widthMode ==MeasureSpec.AT_MOST){//Can't be bigger than...
width =Math.min(desiredWidth, widthSize);}else{//Be whatever you want
width = desiredWidth;}//Measure Heightif(heightMode ==MeasureSpec.EXACTLY){//Must be this size
height = heightSize;}elseif(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));}}@Overridepublicboolean onTouchEvent(MotionEventevent){if(mIndicator){returnfalse;}int action =event.getAction();switch(action){caseMotionEvent.ACTION_DOWN:break;caseMotionEvent.ACTION_MOVE:caseMotionEvent.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;caseMotionEvent.ACTION_CANCEL:break;default:break;}returntrue;}privatefloat 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);returnMath.min(position, mNumStars);}/**
* Sets the listener to be called when the rating changes.
*
* @param listener The listener.
*/publicvoid setOnRatingBarChangeListener(OnRatingBarChangeListener listener){
mOnRatingBarChangeListener = listener;}/**
* @return The listener (may be null) that is listening for rating change
* events.
*/publicOnRatingBarChangeListener getOnRatingBarChangeListener(){return mOnRatingBarChangeListener;}void dispatchRatingChange(boolean fromUser){if(mOnRatingBarChangeListener !=null){
mOnRatingBarChangeListener.onRatingChanged(this, getRating(),
fromUser);}}}5)thenin calling activity---CustomRatingBar coloredRatingBar5=(CustomRatingBar)findViewById(R.id.coloredRatingBar5);
coloredRatingBar5.setOnRatingBarChangeListener(newOnRatingBarChangeListener(){@Overridepublicvoid onRatingChanged(CustomRatingBar ratingBar,float rating,boolean fromUser){// TODO Auto-generated method stubLog.e("RATING",""+rating);}});
6) calificación activa --- tome cualquier imagen con color oscuro porque se usará como transparencia de color para diferentes calificaciones
rating_inactive: tome cualquier imagen del mismo tamaño de la imagen de arriba con fondo claro ... se usará cuando no se seleccione ninguna calificación
No sé por qué, pero parece que su método solo afecta el borde de las estrellas (el color de relleno sigue siendo el color predeterminado)
superpuccio
Ok, te perdiste algunos parámetros xml. Mira mi respuesta aquí abajo.
superpuccio 01 de
1
Tienes razón. No sé por qué estaba pensando que tenía problemas para cambiar el color del borde de la estrella (tal vez porque si el problema que tenía). Tu respuesta es más completa.
Pau Arlandis Martinez
0
Estaba buscando un método confiable para hacer esto hasta API 9 al menos. La solución "transmitir a LayerDrawble" me pareció una solución arriesgada, y cuando la probé en un teléfono Android en 2.3, lanzó correctamente pero la llamada a DrawableCompat.setTint (...) no tuvo ningún efecto.
La necesidad de cargar activos extraíbles tampoco me pareció una buena solución.
Decidí codificar mi propia solución, que es una clase que extiende AppCompatRatingBar, usando un Drawable personalizado que se encarga de dibujar las estrellas mediante programación. Funciona perfectamente para mis necesidades, lo publicaré en caso de que ayude a alguien:
El enlace es más fácil porque puede obtener el archivo completo directamente, pero aquí está el código completo por si acaso:
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.
*/publicclassTintableRatingBarextendsAppCompatRatingBar{privateTintableRatingBarProgressDrawable progressDrawable;publicTintableRatingBar(finalContext context){super(context);
init();}publicTintableRatingBar(finalContext context,finalAttributeSet attrs){super(context, attrs);
init();}publicTintableRatingBar(finalContext context,finalAttributeSet attrs,finalint defStyleAttr){super(context, attrs, defStyleAttr);
init();}privatevoid init(){
progressDrawable =newTintableRatingBarProgressDrawable();
setProgressDrawable(progressDrawable);}publicvoid setCustomTintColors(finalint _uncheckedColor,finalint _pressedColor,finalint _checkedColor){
progressDrawable.setRatingMaxLevelValue(getMax()*1000);
progressDrawable.setUnCheckedColor(_uncheckedColor);
progressDrawable.setPressedColor(_pressedColor);
progressDrawable.setCheckedColor(_checkedColor);
invalidate();}publicclassTintableRatingBarProgressDrawableextendsDrawable{privatestaticfinalint STAR_COUNT =5;privatestaticfinalint STAR_BRANCHES_COUNT =5;/** Sets the max level value: if the level is at the max, then all stars are selected. */privateint ratingMaxLevelValue =10000;/** Color to be painted for unselected stars */privateint uncheckedColor =Color.GRAY;/** Color to be painted for unselected stars when the ratingbar is pressed */privateint pressedColor =Color.CYAN;/** Color to be painted for selected stars */privateint checkedColor =Color.BLUE;@Overridepublicvoid setAlpha(finalint _i){}@Overridepublicvoid setColorFilter(finalColorFilter _colorFilter){}@Overridepublicboolean isStateful(){returntrue;}@Overridepublicboolean setState(finalint[] stateSet){finalboolean res =super.setState(stateSet);
invalidateSelf();return res;}@Overridepublicint getOpacity(){return255;}publicvoid setRatingMaxLevelValue(finalint _ratingMaxLevelValue){
ratingMaxLevelValue = _ratingMaxLevelValue;}publicvoid setUnCheckedColor(finalint _uncheckedColor){
uncheckedColor = _uncheckedColor;}publicvoid setPressedColor(finalint _pressedColor){
pressedColor = _pressedColor;}publicvoid setCheckedColor(finalint _checkedColor){
checkedColor = _checkedColor;}@Overridepublicvoid draw(finalCanvas _canvas){boolean pressed =false;for(int i : getState()){if(i == android.R.attr.state_pressed){
pressed =true;}}finalint level =(int)Math.ceil(getLevel()/(double) ratingMaxLevelValue * STAR_COUNT);finalint starRadius =Math.min(getBounds().bottom /2, getBounds().right / STAR_COUNT /2);for(int i =0; i < STAR_COUNT; i++){finalint usedColor;if(level >= i +1){
usedColor = checkedColor;}elseif(pressed){
usedColor = pressedColor;}else{
usedColor = uncheckedColor;}
drawStar(_canvas, usedColor,(i *2+1)* starRadius, getBounds().bottom /2, starRadius,
STAR_BRANCHES_COUNT);}}privatevoid drawStar(finalCanvas _canvas,finalint _color,finalfloat _centerX,finalfloat _centerY,finalfloat _radius,finalint _branchesCount){finaldouble rotationAngle =Math.PI *2/ _branchesCount;finaldouble 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 drawnfinalfloat bottomOffset =(float)(_radius - _radius *Math.sin(rotationAngle /2)/Math.tan(
rotationAngle /2));finalfloat actualCenterY = _centerY +(bottomOffset /2);finalPaint paint =newPaint();
paint.setColor(_color);
paint.setStyle(Style.FILL);finalPath path =newPath();finalfloat relativeY =(float)(_radius - _radius *(1-Math.sin(rotationAngleComplement)));finalfloat relativeX =(float)(Math.tan(rotationAngle /2)* relativeY);finalPointF a =newPointF(-relativeX,-relativeY);finalPointF b =newPointF(0,-_radius);finalPointF c =newPointF(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();}privatevoid rotationToCenter(finalPointF _point,finaldouble _angleRadian){finalfloat x =(float)(_point.x *Math.cos(_angleRadian)- _point.y *Math.sin(_angleRadian));finalfloat y =(float)(_point.x *Math.sin(_angleRadian)+ _point.y *Math.cos(_angleRadian));
_point.x = x;
_point.y = y;}}}
Como implica la respuesta anterior, no es fácil cambiar el color de la barra de calificación. Las estrellas no se dibujan mediante programación, son imágenes con un tamaño fijo y gradientes de color específicos. Para cambiar el color, debe crear sus propias imágenes de estrellas con diferentes colores y luego crear su propio recurso XML dibujable y pasarlo a la clase ratingsBar usando setProgressDrawable (Drawable d) o el atributo XML android: progressDrawable.
Respuestas:
Paso # 1: Cree su propio estilo, clonando uno de los estilos existentes (desde
$ANDROID_HOME/platforms/$SDK/data/res/values/styles.xml
), colocándolo en su propio proyectostyles.xml
y haciendo referencia a él cuando agregue el widget a un diseño.Paso # 2: Cree sus propios
LayerDrawable
recursos XML paraRatingBar
, señalando las imágenes apropiadas para usar en la barra. Los estilos originales le indicarán los recursos existentes con los que puede comparar. Luego, ajuste su estilo para usar sus propiosLayerDrawable
recursos, en lugar de los incorporados.fuente
Es un poco complicado en el blog mencionado, he usado una forma similar pero más simple. Necesita 3 imágenes de estrellas (red_star_full.png, red_star_half.png y red_star_empty.png) y una xml, eso es todo.
Pon estas 3 imágenes en res / drawable.
Ponga allí la siguiente ratingbar_red.xml:
y, finalmente, dígale a su definición de la barra de calificación que use esto, es decir
Eso es.
fuente
Prueba esto, si solo quieres cambiar el color:
fuente
PorterDuff.Mode.SRC_ATOP
significa exactamente o qué hace?Drawable stars = rb.getProgressDrawable(); stars.setTint( Color.YELLOW );
La forma más fácil que funcionó para mí ... si está extendiendo la actividad de AppCompat
En su build.gradle agregue la última biblioteca de appcompat.
Haga que su actividad se extienda android.support.v7.app.AppCompatActivity
Declare un estilo personalizado en su archivo styles.xml.
Aplique este estilo a su RatingBar a través de Android: atributo de tema.
fuente
style="?android:ratingBarStyleSmall"
juntos.<style name="RatingBarSmallTheme" parent="Theme.AppCompat"> <item name="colorControlNormal">@color/colorOrangeNormal</item> <item name="colorControlActivated">@color/colorOrangeActivated</item> <item name="ratingBarStyle">@style/Widget.AppCompat.RatingBar.Small</item> </style>
y tu calificación Barandroid:theme="@style/RatingBarSmallTheme"
Actualización 2015
Ahora puede usar DrawableCompat para teñir todo tipo de elementos dibujables. Por ejemplo:
Esto es compatible con versiones anteriores hasta API 4
fuente
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {}
ya que funciona de manera predeterminada desde la API 22.Desde API 21 en adelante, es muy fácil cambiar el color de las estrellas con estas tres líneas de código:
Haciéndolo así, cambiarás:
fuente
Si desea cambiar el color de todas las estrellas, le digo que mi uso:
fuente
Las soluciones que Alex y CommonsWares han publicado son correctas. Sin embargo, una cosa de la que Android nunca habla es el tamaño de píxeles adecuado para diferentes densidades. Aquí están las dimensiones requeridas para cada densidad basada en halo de luz.
Pequeña estrella
Estrella mediana
Estrella grande
fuente
Así que he estado luchando con este problema durante dos horas y he encontrado una solución de trabajo para todas las versiones de API, donde también se muestran las calificaciones de media estrella.
Se llama al método con este orden de elementos dibujables:
NOTA: También debe especificar los atributos "max" y "numStars" en XML, de lo contrario no se mostrarán medias estrellas.
fuente
Mode.SRC_IN
oMode.MULTIPLY
?Ahora puede usar DrawableCompat desde AppCompat v22.1.0 en adelante para teñir dinámicamente todo tipo de elementos dibujables, útil cuando admite varios temas con un solo conjunto de elementos dibujables. Por ejemplo:
Esto es compatible con versiones anteriores hasta API 4. Consulte también la publicación de blog de Chris Banes en Support Libraries v22.1.0
Para el tamaño y la forma reales, deberá definir un nuevo estilo y una lista de capas dibujables para el tamaño apropiado, ya que otros ya han respondido anteriormente.
fuente
Utilizar
android:theme
atributo:styles.xml
layout.xml
fuente
Por solo cambiar el color de la barra de calificación de xml: -
fuente
Para cambiar el color solo tienes que configurar el parámetro android: progressTint
Para el tamaño de la propiedad de estilo.
fuente
La forma más simple:
fuente
Construyendo la respuesta de @ lgvalle.
Esto mantendrá los colores de los pasos de fracción.
fuente
usa tu propio color
fuente
Sin agregar un nuevo estilo, puede usar el color de tinte dentro del
RatingBar
fuente
Funciona para Android por debajo y por encima de la versión 21
Después de algunas investigaciones, se me ocurrió este método para establecer el tinte de fondo, el tinte de separación (por ejemplo, media estrella) y el color del tinte de estrella.
fuente
Solución simple, use AppCompatRatingBar y su método setProgressTintList para lograr esto, vea esta respuesta como referencia.
fuente
Resuelvo este problema de la siguiente manera:
fuente
para mí está funcionando ...
fuente
Encontré una solución simple para cambiar el color de la estrella según tu tema.
Ir a este sitio: http://android-holo-colors.com/
Elige el color de tu tema y crea tus imágenes de estrellas.
fuente
Usando las respuestas anteriores, creé un método estático rápido que puede reutilizarse fácilmente. Solo tiene como objetivo teñir el color de progreso de las estrellas activadas. Las estrellas que no están activadas permanecen grises.
Simplemente pase su barra de calificación y un Color usando
getResources().getColor(R.color.my_rating_color)
Como puede ver, uso DrawableCompat para que sea compatible con versiones anteriores.
EDITAR: Este método no funciona en API21 (ve por qué). Terminas con una NullPointerException cuando llamas a setProgressBar. Terminé deshabilitando todo el método en API> = 21.
Para API> = 21, uso la solución SupperPuccio.
fuente
La barra de clasificación se usa automáticamente en tiempo de ejecución para cambiar el color en la estrella táctil.
Primero agregue estilo en el archivo app \ src \ main \ res \ values \ styles.xml:
Luego, su barra de calificación agrega un tema como este:
fuente
1) declara este xml
2) en style.xml
3)
6) calificación activa --- tome cualquier imagen con color oscuro porque se usará como transparencia de color para diferentes calificaciones
rating_inactive: tome cualquier imagen del mismo tamaño de la imagen de arriba con fondo claro ... se usará cuando no se seleccione ninguna calificación
fuente
Una forma muy fácil de cambiar el color del borde de las estrellas es usar el parámetro xml:
en la vista de ratingBar. El valor debe ser un código hexadecimal para un color.
fuente
Estaba buscando un método confiable para hacer esto hasta API 9 al menos. La solución "transmitir a LayerDrawble" me pareció una solución arriesgada, y cuando la probé en un teléfono Android en 2.3, lanzó correctamente pero la llamada a DrawableCompat.setTint (...) no tuvo ningún efecto.
La necesidad de cargar activos extraíbles tampoco me pareció una buena solución.
Decidí codificar mi propia solución, que es una clase que extiende AppCompatRatingBar, usando un Drawable personalizado que se encarga de dibujar las estrellas mediante programación. Funciona perfectamente para mis necesidades, lo publicaré en caso de que ayude a alguien:
https://gist.github.com/androidseb/2b8044c90a07c7a52b4bbff3453c8460
El enlace es más fácil porque puede obtener el archivo completo directamente, pero aquí está el código completo por si acaso:
fuente
Respuesta un poco tardía pero espero que ayude a algunas personas.
Y así es como se ve la WhiteRatingStar
Con esto, las estrellas se colorearán en blanco, por ejemplo.
fuente
Usa este enlace
Calificación de Android Bar cambia los colores de las estrellas
establezca su estilo dentro de valor / estilo (v-21);
fuente
Como implica la respuesta anterior, no es fácil cambiar el color de la barra de calificación. Las estrellas no se dibujan mediante programación, son imágenes con un tamaño fijo y gradientes de color específicos. Para cambiar el color, debe crear sus propias imágenes de estrellas con diferentes colores y luego crear su propio recurso XML dibujable y pasarlo a la clase ratingsBar usando setProgressDrawable (Drawable d) o el atributo XML android: progressDrawable.
fuente