Come fare una barra di valutazione più piccola?


134

Ho aggiunto una barra di valutazione in un layout:

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

Ma lo stile predefinito per la barra di classificazione è troppo grande.
Ho provato a cambiarlo aggiungendo lo stile Android:style="?android:attr/ratingBarStyleSmall"

Ma il risultato è troppo piccolo ed è impossibile stabilire un tasso con questa proprietà.

Come potrei fare?

Risposte:


106

Il widget predefinito di RatingBar è sorta 'zoppo.

La fonte fa riferimento allo stile " ?android:attr/ratingBarStyleIndicator" oltre al " ?android:attr/ratingBarStyleSmall" con cui hai già familiarità. ratingBarStyleIndicatorè leggermente più piccolo ma è ancora piuttosto brutto e i commenti notano che questi stili "non supportano l'interazione".

Probabilmente stai meglio facendo il tuo. C'è una guida dall'aspetto decente su http://kozyr.zydako.net/2010/05/23/pretty-ratingbar/ che mostra come farlo. (Non l'ho ancora fatto da solo, ma ci proverò tra circa un giorno.)

In bocca al lupo!

ps Siamo spiacenti, stavo per pubblicare un link alla fonte in cui cercare in giro ma sono un nuovo utente e non posso pubblicare più di 1 URL. Se ti fai strada attraverso l'albero dei sorgenti, si trova in frameworks / base / core / java / android / widget / RatingBar.java


È molto meglio usare? Android: attr / ratingBarStylePiccolo e imposta il tema di valutazione globale ma non usa esattamente il nome del tema, grazie mille;)
Tsung Goh

7
se impostiamo la proprietà indicatore android: isIndicator = "false" di quanto interagiremo con esso ..
Mayur R. Amipara

I documenti implicano ratingBarStyleSmall è il più piccolo dei due. Penso che il tuo commento sia arretrato.
AdamMc331,

5
Il collegamento è interrotto.
Denny,

@Denny Content è disponibile da Google Cache . Non sto aggiornando il post con il contenuto in quanto non guardo le barre di valutazione di Android da anni e non sono sicuro che il contenuto di quel link sia ancora valido.
Farray,

195

Come incollare il codice indicato qui ...

Passo 1. Hai bisogno delle tue stelle di valutazione in res/drawable...

Una stella piena

Stella vuota

Passaggio 2 res/drawableÈ necessario ratingstars.xmlcome segue ...

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

Passaggio 3 res/valuesÈ necessario styles.xmlcome segue ...

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

Passaggio 4 Nel layout ...

<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
Non lo so: <item android: id = "@ + android: id / secondarioProgress" android: drawable = "@ drawable / star_empty" /> be "@ drawable / star_half" /> o come lo hai chiamato?
StackOverflow del

8
Grazie mille. Tuttavia, solo un piccolo commento: non è necessaria alcuna immagine di mezza stella. Verrà generato automaticamente in base allo stato di avanzamento.
Boris Strandjev,

1
@Vlad Leggi la prima riga di risposta che ho menzionato da dove ottengo questo.
Vaibhav Jani,

4
funziona perfettamente :) ma ho 2 problemi .. numStars non funziona più, e non riesco a renderlo un po 'più grande anche se imposto la larghezza massima e minima
Ahmad Dwaik' Warlock

1
Grazie @PiedPiper - questo mi ha fatto risparmiare un sacco di tempo !! La migliore spiegazione di sempre!
Edmond Tamas,

70

Usa solo:

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

Cambia il fattore di scala in base alle tue necessità.

Per ridimensionare senza creare un'imbottitura sulla sinistra, aggiungere anche

android:transformPivotX="0dp"

scaleX scaleY sono buoni ma lasciate una brutta imbottitura, se poteste liberarvi di quella imbottitura sarebbe la risposta perfetta più semplice
Ahmad Dwaik "Stregone",

inoltre, richiedono Android 3.0 / API 11
averasko

6
Risolvo la brutta imbottitura (a destra) di codeandroid:scaleX="0.75" android:scaleY="0.75" android:layout_marginRight="-25dp"
hannes ach

1
Anche se sembra la soluzione più semplice, non ha funzionato per me. Per qualche motivo non c'è stato alcun effetto. È perché sono su Android 5.x?
Nautilus,

puoi rimuovere qualche imbottitura aggiuntiva specificando l'altezza della barra di valutazione es:android:layout_height="40dp"
Manohar Reddy,

43

Non è necessario aggiungere un listener a ?android:attr/ratingBarStyleSmall. Basta aggiungere android:isIndicator=falsee acquisirà eventi di clic, ad es

<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 è la chiave!
pesce morto

19

quello piccolo implementato dal sistema operativo

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

2
La barra di valutazione non è selezionabile quando si fornisce il codice sopra.
Sharath,

16

applicare questo.

<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
Anche se visivamente è fantastico. gli eventi click non funzionano su questa soluzione. hai qualche soluzione per questo?
Gökhan Barış Aker,

4
se vuoi che i clic funzionino usa android: isIndicator = "false"
D4rWiNS

15

Ho trovato una soluzione più semplice di quella che penso data da quelle sopra e più facile che realizzarne una tua. Ho semplicemente creato una piccola barra di valutazione, quindi ho aggiunto un onTouchListener. Da lì computo l'ampiezza del clic e ne determino il numero di stelle. Dopo averlo usato più volte, l'unica stranezza che ho riscontrato è che il disegno di una piccola barra di valutazione non viene sempre visualizzato correttamente in una tabella a meno che non lo racchiuda in un LinearLayout (sembra corretto nell'editor, ma non nel dispositivo) . Comunque, nel mio layout:

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

e nell'ambito della mia attività:

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

Spero che questo aiuti qualcun'altro. Decisamente più facile che disegnare da soli (anche se ho scoperto che funziona anche, ma volevo solo un facile utilizzo delle stelle).


Funziona ed è facile ... ma le ratingBarStyleSmallstelle sono davvero troppo piccole per essere utili. Penso che dovrò rotolare il mio per ottenere stelle di dimensioni intermedie.
Beer Me,

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>

// aggiungi queste righe per una piccola barra di valutazione

style = "?android:attr/ratingBarStyleSmall"

Sebbene questo frammento di codice possa essere la soluzione, includendo una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
Johan,

3

anche se la risposta di Farry funziona, per i dispositivi Samsung RatingBar ha assunto un colore blu casuale anziché definito da me. Quindi usa

style="?attr/ratingBarStyleSmall"

anziché.

Codice completo come usarlo:

<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

La migliore risposta per una piccola barra di valutazione

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

2

Usa questo codice

<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

La migliore risposta che ho ricevuto

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

utente come questo

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

Aumenta / Diminuisci le dimensioni usando scaleX e scaleY value


1

utilizzare il seguente codice per una piccola barra di valutazione con l'evento 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

Dopo molte ricerche ho scoperto che la soluzione migliore per ridurre le dimensioni delle barre di valutazione personalizzate è quella di ottenere le dimensioni dei progressi disegnabili in determinate dimensioni, come indicato di seguito:

xxhdpi - 48 * 48 px

xhdpi - 36 * 36 px

hdpi - 24 * 24 px

E in grande stile metti il ​​massimo e il massimo come 16 dp per tutte le risoluzioni.

Fammi sapere se questo non ti aiuta a ottenere le migliori barre di valutazione di piccole dimensioni poiché queste dimensioni ho trovato molto compatibili ed equivalenti all'attributo di stile ratingbar.small.


0

Funziona per me nella barra di valutazione xml style = "? Android: attr / ratingBarStyleSmall" aggiungi this.it funzionerà.


-4

Risolvo questo problema nel modo seguente: style = "? Android: attr / ratingBarStyleSmall"


Questo è ciò che l'OP ha già provato e altre risposte hanno già menzionato.
Pang
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.