Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android RatingBar: No puede completar un ratingBar parcial si personalizo su color

He fijado el color del ratingBar a un color diferente al azul y al gris por defecto del androide – he hecho mis estrellas con un fondo negro y color de rosa si están seleccionadas.

Este es mi código para mi mainactivity:

  • Error de memoria al cargar mapas de bits
  • QUERIDO: TableLayout-Like ListView
  • OnClickListener no se puede resolver a un tipo (Eclipse)
  • Cómo implementar "Deslizar hacia abajo para actualizar" como en la nueva aplicación de GMail
  • IllegalStateException - Biblioteca de soporte de fragmentos
  • Gradle versión 1.8 es necesario. La versión actual es 1.9-rc-3 - Android Studio
  • public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingbar); LayerDrawable layerDrawable2 = (LayerDrawable) ratingBar.getProgressDrawable(); DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0)), ContextCompat.getColor(getApplicationContext(), android.R.color.background_dark)); DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1)), ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); // Partial star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2)), ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); ratingBar.setIsIndicator(false); ratingBar.setRating(3.6f); ratingBar.setStepSize(0.1f); ratingBar.invalidate(); ratingBar.setIsIndicator(true); } } 

    Usted puede ver que si pongo en la calificación como 3.6, se selecciona hasta 4.

    Introduzca aquí la descripción de la imagen

    Sin embargo, si comento mis propios colores personalizados, el ratingBar se fija correctamente para mostrar solamente una parte de la 4ta estrella como llenada pues el valor pasado a él era 3.6:

     public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingbar); /* LayerDrawable layerDrawable2 = (LayerDrawable) ratingBar.getProgressDrawable(); DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0)), ContextCompat.getColor(getApplicationContext(), android.R.color.background_dark)); DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1)), ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); // Partial star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2)), ContextCompat.getColor(getApplicationContext(), R.color.colorAccent));*/ ratingBar.setIsIndicator(false); ratingBar.setRating(3.6f); ratingBar.setStepSize(0.1f); ratingBar.invalidate(); ratingBar.setIsIndicator(true); } } 

    Introduzca aquí la descripción de la imagen

    ¿Por qué es que si creo mis propios colores personalizados, el ratingBar no se llena correctamente?

    He creado un pequeño repo y puedes descargarlo y probarlo aquí: https://github.com/Winghin2517/RatingBarTest2

    EDITAR:

    La biblioteca de FlyingPumba muestra alguna promesa sobre lo que quiero lograr pero necesitaría un estilo donde el fondo de las estrellas sea blanco cuando aparezca en la pantalla y será llenado por un color sólido cuando los usuarios presionen la estrella. En mi caso, quiero que esté lleno de un color verde.

    Lo que sigue es lo que pude lograr, pero todavía no ha llegado. Cambié el fondo del scrollview en el cual las estrellas se sientan a color de rosa de modo que usted pueda ver que en vez de un fondo blanco para las estrellas, el color de rosa del fondo del scrollview brilla a través. Para mi caso de uso, quiero que las estrellas blancas se sienten delante de una imagen y no quiero que la imagen en la imagen vista brille a través de las estrellas.

    También no necesito el movimiento blanco para las estrellas en absoluto pues quiero mantener el estilo de las estrellas simple.

     <com.iarcuschin.simpleratingbar.SimpleRatingBar android:id="@+id/ratingBar3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" app:srb_rating="3.6" app:srb_fillColor="@color/material_greenA700" app:srb_borderColor="@color/material_white" app:srb_starBorderWidth="0" app:srb_pressedFillColor="@color/material_greenA700" app:srb_starSize="30dp" /> 

    Introduzca aquí la descripción de la imagen

  • OnActivityResult () llamado prematuramente
  • Cómo comprobar si una actividad se está ejecutando o no
  • Ver con panorámica horizontal y vertical / arrastrar y pinch-zoom
  • Obtener eventos táctiles en un diálogo que se muestra mientras el dedo ya estaba tocando la pantalla
  • ¿Cómo subir un DialogFragment sobre otro?
  • Estadísticas sobre dispositivos Android con procesadores MIPS
  • 4 Solutions collect form web for “Android RatingBar: No puede completar un ratingBar parcial si personalizo su color”

    Usted está en el camino correcto con lo que está tratando. Lo único que has hecho mal es asignar el color equivocado a la 2 ª dibujable.

    Piense en el segundo dibujable como el fondo de la estrella, no el primer plano. Así que las estrellas parciales necesitan el color de fondo, no el color de las estrellas, es decir, en su ejemplo, negro, no rosa.

    A continuación se muestra el código corregido, que funciona como se describe. Lo he reformateado un poco para resaltar el cambio requerido.

      RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingbar); LayerDrawable layerDrawable2 = (LayerDrawable) ratingBar.getProgressDrawable(); // No star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0)), ContextCompat.getColor(getApplicationContext(), android.R.color.background_dark)); // Partial star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1)), ContextCompat.getColor(getApplicationContext(), // use background_dark instead of colorAccent // R.color.colorAccent)); android.R.color.background_dark)); // Custom star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2)), ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); 

    Otra forma de hacerlo, y posiblemente mejor en muchos casos, es usar un estilo adecuado en la RatingBar .

    Esto requiere establecer un estilo personalizado para la barra de calificación y, a continuación, definir los elementos desplegables de la capa utilizados por ese estilo para que apunte a sus propias imágenes o colores.

    No voy a entrar en más detalles, porque el código xml real se muestra en la respuesta de Anantham .

    En Activity.java:

    Crecer

      RatingBar setRatingBar = (RatingBar) findViewById(R.id.setRating); float rating = Float.parseFloat(listString); // onRatingChanged(setRatingBar, 0.0f, true); public void onRatingChanged(RatingBar rateBar, float rating, boolean fromUser) { try { DecimalFormat decimalFormat = new DecimalFormat("#.#"); curRate = Float.valueOf(decimalFormat.format((curRate * count + rating)/ ++count)); float userRatePoint = curRate/**20*/; setRatingBar.setRating(userRatePoint); countText = (TextView) findViewById(R.id.countText); countText.setText(userRatePoint + " Ratings"); } catch (Exception e) { e.printStackTrace(); } } 

    Entonces intente esto para la barra de clasificación smallstar:

      <RatingBar android:id="@+id/setRating" style="?android:attr/ratingBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="3dp" android:isIndicator="true" android:numStars="5" android:stepSize="0.1" /> //if you want to style please use "foodRatingBar" //for custom star image use "ratingstar" 

    Style.xml:

     <?xml version="1.0" encoding="utf-8"?> <resources> <style name="foodRatingBar" parent="@android:style/Widget.RatingBar"> <item name="android:progressDrawable">@drawable/ratingstar</item> <item name="android:minHeight">22dip</item> <item name="android:maxHeight">22dip</item> </style> 

    Valores v11 / styles.xml

     <?xml version="1.0" encoding="utf-8"?> <resources> <style name="foodRatingBar" parent="@android:style/Widget.RatingBar"> <item name="android:progressDrawable">@drawable/ratingstar</item> <item name="android:minHeight">22dip</item> <item name="android:maxHeight">22dip</item> </style> 

    Valores v14 / styles.xml

      <resources> <style name="foodRatingBar" parent="@android:style/Widget.RatingBar"> <item name="android:progressDrawable">@drawable/ratingstar</item> <item name="android:minHeight">22dip</item> <item name="android:maxHeight">22dip</item> </style> <!-- Base application theme for API 14+. This theme completely replaces AppBaseTheme from BOTH res/values/styles.xml and res/values-v11/styles.xml on API 14+ devices. --> <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <!-- API 14 theme customizations can go here. --> </style> </resources> 

    Ratingstar.xml – es donde se definen las imágenes de progreso personalizadas

     <?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/ratingstar_default" /> <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/ratingstar_default" /> <item android:id="@android:id/progress" android:drawable="@drawable/ratingstar_selected" /> </layer-list> </resources> 

    Sólo tienes que actualizar DrawableCompat.wrap(..) .mutate() con .mutate() . Usted código es mirada como abajo:

     DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(0).mutate()), ContextCompat.getColor(getApplicationContext(), android.R.color.background_dark)); DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(1).mutate()), ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); // Partial star DrawableCompat.setTint(DrawableCompat.wrap(layerDrawable2.getDrawable(2).mutate()), ContextCompat.getColor(getApplicationContext(), R.color.colorAccent)); 

    Si el color se cambia dynamicallyy el drawable debe ser mutable

    Ver pregunta: Android: Tono con DrawableCompat

    Y responda: https://stackoverflow.com/a/30928051/2949612

    Usted puede ver el blog mutaciones Drawable por Romain Guy y también ver mutate () método android desarrollador doc.

    Espero que te ayude.

    El uso de la RatingBar de la acción puede ser muy doloroso, usted debe intentar esta biblioteca: SimpleRatingBar .

    (Estoy un poco parcial, ya que soy el creador)

    Cuenta con:

    • Totalmente funcional android:layout_width : puede ser configurado como wrap_content , match_parent o abrpity dp.
    • Número arbitrario de estrellas.
    • Tamaño de paso arbitrario.
    • El tamaño de las estrellas se puede controlar exactamente o estableciendo un tamaño máximo.
    • Colores personalizables en estado normal (borde, relleno y fondo de estrellas).
    • Colores personalizables en estado presionado (borde, relleno y fondo de estrellas).
    • Separación adaptable del tamaño entre las estrellas.
    • Anchura adaptable de la frontera de estrellas.
    • Rincón de esquina de estrellas personalizable.
    • Permite establecer OnRatingBarChangeListener
    • El relleno de estrellas se puede configurar para comenzar de izquierda a derecha o de derecha a izquierda (soporte de idioma RTL).
    • AnimationBuilder integrado en la vista para establecer la calificación mediante programación con animación.

    Aquí hay una vista previa de la misma .

    Puede encontrarlo en jcenter o en Maven Central . Así que en su archivo build.gradle sólo agregue a sus dependencias:

    compile 'com.iarcuschin:simpleratingbar:0.1.+'

    EDIT: He añadido recientemente la posibilidad de cambiar el color de fondo de las estrellas (color vacío) y desactivar el borde. Para lograr lo que querías puedes añadir a tu diseño:

     <com.iarcuschin.simpleratingbar.SimpleRatingBar android:id="@+id/ratingBar3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" app:srb_rating="3.6" app:srb_starBackgroundColor="@color/white" app:srb_fillColor="@color/material_greenA700" app:srb_borderColor="@color/material_white" app:srb_pressedFillColor="@color/material_greenA700" app:srb_starSize="30dp" app:srb_drawBorderEnabled="false" /> 

    Espero que sea útil.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.