Android RatingBar: не может заполнить частичный рейтингBar, если я настрою его цвет

Я установил цвет ratingBar на другой цвет по умолчанию для синего и серого Android – я сделал свои звезды с черным фоном и розовыми, если они выбраны.

Это мой код для моей основной деятельности:

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

Вы можете видеть, что если я ставлю в рейтинге 3,6, он выбирает до 4.

Введите описание изображения здесь

Однако, если я прокомментирую свои собственные настроенные цвета, ratingBar правильно настроит отображение только части 4-й звезды, заполненной, так как значение, переданное ей, равно 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); } } 

Введите описание изображения здесь

Почему, если я создаю свои собственные цвета, ratingBar не заполняется должным образом?

Я создал небольшое репо, и вы можете скачать его и протестировать здесь: https://github.com/Winghin2517/RatingBarTest2

РЕДАКТИРОВАТЬ:

Библиотека FlyingPumba демонстрирует некоторые надежды на то, что я хочу достичь, но мне нужен стиль, когда фон звезд белый, когда он появляется на экране, и он будет заполнен сплошным цветом, когда пользователи нажимают на звезду. В моем случае я хочу, чтобы он был заполнен зеленым цветом.

Нижеследующее – это то, что я смог достичь, но пока не совсем. Я изменил фон scrollview, в котором звезды сидят на розовом, так что вы можете видеть, что вместо белого фона для звезд светит розовый фон прокрутки. Для моего варианта использования я хочу, чтобы белые звезды сидели перед представлением изображения, и я не хочу, чтобы изображение в изображении было сияющим сквозь звезды.

Также мне не нужен белый штрих для звезд вообще, поскольку я хочу, чтобы стиль стилей был простым.

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

Введите описание изображения здесь

Solutions Collecting From Web of "Android RatingBar: не может заполнить частичный рейтингBar, если я настрою его цвет"

Вы на правильном пути с тем, что вы пытаетесь. Единственное, что вы сделали неправильно, – это присвоить неправильный цвет второму доступному.

Подумайте о том, что второй можно использовать в качестве фона звезды, а не на переднем плане. Таким образом, частичным звездам нужен цвет фона, а не цвет звезд, т. Е. В вашем примере черный, а не розовый.

Ниже приведен исправленный код, который работает, как описано. Я немного переформатировал его, чтобы выделить необходимые изменения.

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

Другой способ сделать это и, возможно, лучше во многих случаях – использовать правильный стиль в RatingBar .

Для этого требуется установка индивидуального стиля для бара рейтинга, а затем определение слоев, используемых этим стилем, чтобы указать на ваши собственные изображения или цвета.

Я не буду вдаваться в подробности, потому что фактический xml-код показан в ответе Анантама .

В Activity.java:

Oncreate:

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

Затем попробуйте это для малой шкалы рейтинга:

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

Значения 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> 

Значения 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 – здесь определяются пользовательские изображения прогресса

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

Вам просто нужно обновить DrawableCompat.wrap(..) с помощью .mutate() . Код выглядит следующим образом:

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

Если цвет изменяется динамически, то подлежащий изгибу должен быть изменен

См. Вопрос: Android: оттенок с использованием DrawableCompat

И ответ: https://stackoverflow.com/a/30928051/2949612

Вы можете посмотреть блог Drawable mutations от Romain Guy, а также просмотреть файл разработчика android разработчика mutate () .

Надеюсь, это поможет вам.

Использование фонда RatingBar может быть очень болезненным, вы должны попробовать эту библиотеку: SimpleRatingBar .

(Я немного предвзятый, поскольку я создатель)

Он имеет:

  • Полностью работающий android:layout_width : его можно установить как wrap_content , match_parent или abritary dp.
  • Произвольное число звезд.
  • Произвольный размер шага.
  • Размер звезд можно контролировать точно или задавая максимальный размер.
  • Настраиваемые цвета в нормальном состоянии (граница, заливка и фон звезд).
  • Настраиваемые цвета в нажатом состоянии (граница, заливка и фон звезд).
  • Настраиваемая разметка размеров между звездами.
  • Настраиваемая ширина границ звезд.
  • Настраиваемый радиус угла звезды.
  • Позволяет установить OnRatingBarChangeListener
  • Заполнение звездочек может начинаться слева направо или справа налево (поддержка языка RTL).
  • AnimationBuilder интегрирован в представление, чтобы автоматически присвоить рейтинг анимации.

Вот его предварительный просмотр .

Вы можете найти его либо в jcenter либо в Maven Central . Поэтому в файле build.gradle просто добавьте свои зависимости:

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

EDIT: Недавно я добавил возможность изменения цвета фона звезд (пустой цвет) и отключения границы. Чтобы достичь желаемого, вы можете добавить к своему макету:

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

Надеюсь, это полезно.