Як зробити менший RatingBar?


134

Я додав рейтингBar у макет:

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

Але результат занадто малий і встановити ставку з цією властивістю неможливо.

Як я міг це зробити?

Відповіді:


106

Віджет RatingBar за замовчуванням - це "кульгавий".

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

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

Удачі!

ps Вибачте, збирався опублікувати посилання на джерело, щоб ви заглянули, але я новий користувач і не можу розмістити більше 1 URL-адреси. Якщо ви копаєте шлях через дерево-джерело, воно розташоване на frameworks / base / core / java / android / widget / RatingBar.java


Набагато краще використовувати? Android: attr / ratingBarStyleSmall і встановити глобальну рейтингову тему, але не використовувати саме тему, спасибі велике;)
Tsung Goh

7
якщо ми встановимо властивість індикатора android: isIndicator = "false", то ми будемо з ним взаємодіяти ..
Mayur R. Amipara

У документах на увазі ratingBarStyleSmall меншого з двох. Я думаю, що ваш коментар є зворотним.
AdamMc331

5
Посилання розірвано.
Денні

Вміст @Denny доступний у кеші Google . Я не оновлюю публікацію контентом, оскільки я не переглядав рейтинги Android на протязі років, і не впевнений, чи вміст у цьому посиланні все-таки дійсний.
Farray

195

Як склеїти наведений тут код ...

Крок 1. Вам потрібні власні зірки рейтингу у res/drawable...

Повна зірка

Порожня зірка

Крок-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"    
/>  

7
Не варто цього: <item android: id = "@ + android: id / secondProgress" android: dravable = "@ dravable / star_empty" /> бути "@ dravable / star_half" /> або як би ти його не назвав?
StackOverflowed

8
Дякую купу. Однак лише невеликий коментар: вам не потрібно зображення півзірки. Він буде генерований автоматично на основі прогресу.
Борис Страндєв

1
@Vlad Прочитайте перший рядок відповіді, про який я згадав.
Вайбхав Яні

4
працює чудово :) але у мене є 2 випуски .. numStars більше не працює, і я не можу отримати його трохи більше, навіть якщо я встановив max і min width
Ahmad Dwaik 'Warlock'

1
Дякую @PiedPiper - це врятувало мені багато часу !! Найкраще пояснення будь-коли!
Едмонд Тамас

70

Просто використовуйте:

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

Змініть коефіцієнт масштабу відповідно до ваших потреб.

Для масштабування, не створюючи прокладки зліва, також додайте

android:transformPivotX="0dp"

scaleX scaleY - це добре, але залиште некрасиві набивки, якщо ви зможете позбутися від цієї підкладки, це буде найпростішою ідеальною відповіддю
Ахмад Двайк 'Warlock'

також, їм потрібен Android 3.0 / API 11
averasko

6
Я вирішую потворну (праву) підкладку від codeandroid:scaleX="0.75" android:scaleY="0.75" android:layout_marginRight="-25dp"
hannes ach

1
Хоча це виглядає як найпростіше рішення, для мене це не спрацювало. Чомусь ефекту не було. Це тому, що я на Android 5.x?
Наутілус

ви можете видалити додаткові накладки, вказавши висоту рейтингової смуги, наприклад:android:layout_height="40dp"
Манохар Редді

43

Не потрібно додавати слухача до ?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" />

4
isIndicator - ключ!
мертвий рибок

19

маленька реалізація ОС

<RatingBar
    android:id="@+id/ratingBar"
    style="?android:attr/ratingBarStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    />

2
Рядок рейтингу не можна натискати при наданні вищевказаного коду.
Шарат

16

застосувати це.

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

1
Хоча візуально це чудово. натисніть події, які не працюють над цим рішенням. у вас є якісь виправлення з цього приводу?
Gökhan Barış Aker

4
якщо ви хочете, щоб кліки працювали на android: isIndicator = "false"
D4rWiNS

15

Я знайшов більш просте рішення, ніж я думаю, що це дано вище, і простіше, ніж прокат свого. Я просто створив невеликий рейтинг, а потім додав до нього 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; 
        } 
    });

Я сподіваюся, що це допомагає комусь іншому. Однозначно простіше, ніж малювати власне (хоча я виявив, що це також працює, але я просто хотів простого використання зірок).


Це працює, і це легко ... але ratingBarStyleSmallзірок дійсно занадто мало, щоб бути корисним. Я думаю, що мені доведеться розгорнути свою власну, щоб отримати зірки проміжного розміру.
Пиво мені

5
<RatingBar
    android:id="@+id/rating_bar"
    style="@style/Widget.AppCompat.RatingBar.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

5
 <RatingBar
                    android:rating="3.5"
                    android:stepSize="0.5"
                    android:numStars="5"
                    style = "?android:attr/ratingBarStyleSmall"
                    android:theme="@style/RatingBar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>

// if you want to style 

 <style name="RatingBar" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/colorPrimary</item>
        <item name="colorControlActivated">@color/colorAccent</item>
    </style>

// додайте ці рядки для малого рейтингу

style = "?android:attr/ratingBarStyleSmall"

Хоча цей фрагмент коду може бути вирішенням, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
Йоган

3

хоча відповідь Farry працює, для пристроїв Samsung RatingBar взяв випадковий синій колір замість визначеного мною. Тож використовуйте

style="?attr/ratingBarStyleSmall"

замість цього.

Повний код, як ним користуватися:

<android.support.v7.widget.AppCompatRatingBar
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                style="?attr/ratingBarStyleSmall" // use smaller version of icons
                android:theme="@style/RatingBar"
                android:rating="0"
                tools:rating="5"/>

<style name="RatingBar" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/grey</item>
        <item name="colorControlActivated">@color/yellow</item>
        <item name="android:numStars">5</item>
        <item name="android:stepSize">1</item>
    </style>

3

Найкраща відповідь для невеликої рейтингової панелі

<RatingBar
                    android:layout_width="wrap_content"
                    style = "?android:attr/ratingBarStyleSmall"
                    android:layout_height="wrap_content" />

2

Використовуйте цей код

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

2

Найкраща відповідь, яку я отримав

  <style name="MyRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:minHeight">15dp</item>
    <item name="android:maxHeight">15dp</item>
    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/home_add</item>
</style>

користувач, як це

<RatingBar
                style="?android:attr/ratingBarStyleIndicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:isIndicator="false"
                android:max="5"
                android:rating="3"
                android:scaleX=".8"
                android:scaleY=".8"
                android:theme="@style/MyRatingBar" />

Збільшення / зменшення розмірів за допомогою Scalex і ScaleY значення


1

використовувати наступний код для невеликого рядка рейтингу з подією onTouch

enter code here


<RatingBar
            android:id="@+id/ratingBar"
            style="?android:ratingBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:isIndicator="false"
            android:rating="4"
            android:stepSize="0.5" />

0

Після численних досліджень я знайшов найкраще рішення зменшити розмір користувацьких рейтингових барів - отримати розмір прогресу, який можна зрозуміти в певних розмірах, як зазначено нижче:

xxhdpi - 48 * 48 пікс

xhdpi - 36 * 36 пікс

hdpi - 24 * 24 px

І в стилі покладіть міні-висоту і максимальну висоту як 16 dp для всієї роздільної здатності.

Повідомте мене, якщо це не допоможе вам отримати кращі рейтинги невеликих розмірів, оскільки ці розміри я вважаю дуже сумісними та еквівалентними атрибуту стилю ratingbar.small.


0

Його робота для мене в рейтингу xml style = "? Android: attr / ratingBarStyleSmall" додати це. Воно буде працювати.


-4

Я вирішую це питання наступним чином: style = "? Android: attr / ratingBarStyleSmall"


Це те, що ОП вже намагалося, а інші відповіді вже згадували.
Панг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.