Как сделать меньший RatingBar? - PullRequest
127 голосов
/ 20 мая 2010

Я добавил RatingBar в макете:

<RatingBar 
    android:id="@+id/ratingbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:numStars="5"
    android:stepSize="1.0"
    />  

Но стиль по умолчанию для строки рейтинга слишком велик.
Я пытаюсь изменить его, добавив стиль Android: style="?android:attr/ratingBarStyleSmall"

Но результат слишком мал, и с помощью этого свойства невозможно установить ставку.

Как я мог это сделать?

Ответы [ 18 ]

193 голосов
/ 30 июля 2011

Как приклеить указанный код здесь ...

Шаг-1. Вам нужен собственный рейтинг звезд в res/drawable ...

A full star

Empty star

Шаг-2 В res/drawable вам нужно ratingstars.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/star_empty" />
    <item android:id="@android:id/secondaryProgress"
          android:drawable="@drawable/star_empty" />
    <item android:id="@android:id/progress"
          android:drawable="@drawable/star" />
</layer-list>

Шаг-3 В res/values вам нужно styles.xml, как следует ...

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

Шаг 4 В вашем макете ...

<RatingBar 
      android:id="@+id/rtbProductRating"
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"
      android:numStars="5"
      android:rating="3.5"
      android:isIndicator="false"
      style="@style/foodRatingBar"    
/>  
103 голосов
/ 04 июля 2010

Виджет по умолчанию для RatingBar - это sorta 'lame.

Источник ссылается на стиль "?android:attr/ratingBarStyleIndicator" в дополнение к "?android:attr/ratingBarStyleSmall", с которым вы уже знакомы. ratingBarStyleIndicator немного меньше, но все еще довольно уродливо, и в комментариях отмечается, что эти стили "не поддерживают взаимодействие".

Тебе, наверное, лучше катать свои собственные. На http://kozyr.zydako.net/2010/05/23/pretty-ratingbar/ есть приличное руководство, показывающее, как это сделать. (Я сам еще этого не делал, но попробую через день или около того.)

Удачи!

p.s. Извините, я собирался опубликовать ссылку на источник, чтобы вы могли в нем разобраться, но я новый пользователь и не могу опубликовать более 1 URL. Если вы копаетесь в дереве исходников, оно находится в frameworks / base / core / java / android / widget / RatingBar.java

67 голосов
/ 27 августа 2014

Просто используйте:

android:scaleX="0.5"
android:scaleY="0.5"

Измените масштабный коэффициент в соответствии с вашими потребностями.

Чтобы масштабировать без создания отступа слева, также добавьте

android:transformPivotX="0dp"
40 голосов
/ 13 июля 2013

Нет необходимости добавлять слушателя к ?android:attr/ratingBarStyleSmall. Просто добавь android:isIndicator=false, и он будет захватывать события клика, например,

<RatingBar
  android:id="@+id/myRatingBar"
  style="?android:attr/ratingBarStyleSmall"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:numStars="5"
  android:isIndicator="false" />
19 голосов
/ 12 июня 2013

маленький реализованный ОС

<RatingBar
    android:id="@+id/ratingBar"
    style="?android:attr/ratingBarStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    />
15 голосов
/ 17 сентября 2012

Я нашел более простое решение, чем я думаю, приведенное выше, и проще, чем собственное. Я просто создал небольшую рейтинговую панель, а затем добавил к ней onTouchListener. Оттуда я вычисляю ширину клика и определяю количество звезд из этого. Используя это несколько раз, я обнаружил единственную причуду, заключающуюся в том, что рисование маленькой строки рейтинга не всегда получается правильным в таблице, если я не заключаю ее в LinearLayout (выглядит прямо в редакторе, но не на устройстве) , Во всяком случае, в моем макете:

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" >
                <RatingBar
                    android:id="@+id/myRatingBar"
                    style="?android:attr/ratingBarStyleSmall"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:numStars="5" />
            </LinearLayout>

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

    final RatingBar minimumRating = (RatingBar)findViewById(R.id.myRatingBar);
    minimumRating.setOnTouchListener(new OnTouchListener()
    { 
        public boolean onTouch(View view, MotionEvent event)
        { 
            float touchPositionX = event.getX();
            float width = minimumRating.getWidth();
            float starsf = (touchPositionX / width) * 5.0f;
            int stars = (int)starsf + 1;
            minimumRating.setRating(stars);
            return true; 
        } 
    });

Надеюсь, это поможет кому-то еще. Определенно проще, чем рисовать свои собственные (хотя я обнаружил, что это тоже работает, но я просто хотел легко использовать звезды).

14 голосов
/ 30 июля 2011

примените это.

<RatingBar android:id="@+id/indicator_ratingbar"
    style="?android:attr/ratingBarStyleIndicator"
    android:layout_marginLeft="5dip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical" />
5 голосов
/ 17 августа 2017
<RatingBar
    android:id="@+id/rating_bar"
    style="@style/Widget.AppCompat.RatingBar.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
2 голосов
/ 30 ноября 2016

Используйте этот код

<RatingBar
    android:id="@+id/ratingBarSmalloverall"
    style="?android:attr/ratingBarStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="30dp"
    android:isIndicator="false"
    android:numStars="5" />
2 голосов
/ 13 февраля 2017
<RatingBar
    android:id="@+id/ratingBar1"
    android:numStars="5"
    android:stepSize=".5"
    android:rating="3.5"
    style="@android:style/Widget.DeviceDefault.RatingBar.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
...