Làm thế nào để tạo một RatingBar nhỏ hơn?


134

Tôi đã thêm một RatingBar trong bố cục:

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

Nhưng kiểu mặc định cho thanh đánh giá là quá lớn.
Tôi đã cố gắng thay đổi nó bằng cách thêm phong cách Android:style="?android:attr/ratingBarStyleSmall"

Nhưng kết quả là quá nhỏ và không thể thiết lập tỷ lệ với tài sản này.

Làm thế nào tôi có thể làm?

Câu trả lời:


106

Tiện ích RatingBar mặc định là khập khiễng.

Nguồn này tham chiếu đến kiểu " ?android:attr/ratingBarStyleIndicator" ngoài " ?android:attr/ratingBarStyleSmall" mà bạn đã quen thuộc. ratingBarStyleIndicatornhỏ hơn một chút nhưng nó vẫn khá xấu và các ý kiến ​​lưu ý rằng những kiểu này "không hỗ trợ tương tác".

Bạn có lẽ tốt hơn nên tự lăn. Có một hướng dẫn dễ nhìn tại http://kozyr.zydako.net/2010/05/23/pretty-ratingbar/ chỉ cho bạn cách làm điều này. (Tôi chưa làm điều đó một mình, nhưng sẽ cố gắng trong một ngày hoặc lâu hơn.)

Chúc may mắn!

ps Xin lỗi, tôi sẽ đăng một liên kết đến nguồn để bạn chọc vào nhưng tôi là người dùng mới và không thể đăng nhiều hơn 1 URL. Nếu bạn tìm đường đi qua cây nguồn, nó sẽ nằm ở các khung / cơ sở / lõi / java / android / widget / RatingBar.java


Tốt hơn nhiều để sử dụng? Android: attr / ratingBarStyleSmall và đặt chủ đề xếp hạng toàn cầu nhưng không sử dụng tên chủ đề chính xác, cảm ơn rất nhiều;)
Tsung Goh

7
nếu chúng ta đặt thuộc tính chỉ báo android: isIndicator = "false" thì chúng ta sẽ tương tác với nó ..
Mayur R. Amipara

Các tài liệu ngụ ý ratingBarStyleSmall là nhỏ hơn trong hai. Tôi nghĩ nhận xét của bạn là lạc hậu.
AdamMc331

5
Liên kết bị hỏng.
Denny

Nội dung @Denny có sẵn từ Google Cache . Tôi không cập nhật bài đăng với nội dung vì tôi đã xem các thanh xếp hạng Android trong nhiều năm và không chắc chắn liệu nội dung trong liên kết đó có còn hiệu lực hay không.
Farray

195

Làm thế nào để dán mã được đưa ra ở đây ...

Bước 1. Bạn cần những ngôi sao xếp hạng của riêng bạn trong res/drawable...

Một ngôi sao đầy đủ

Ngôi sao trống

Bước 2 Trong res/drawablebạn cần ratingstars.xmltheo dõi ...

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

Bước 3 Trong res/valuesbạn cần styles.xmltheo dõi ...

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

Bước 4 Trong cách bố trí của bạn ...

<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
Không phải thế này: <item android: id = "@ + android: id / juniorProTHER" android: drawable = "@ drawable / star_empty" /> là "@ drawable / star_half" /> hoặc bất cứ điều gì bạn gọi nó?
StackOverflow

8
Cảm ơn nhiều. Tuy nhiên, chỉ cần một nhận xét nhỏ: bạn không cần hình ảnh của một nửa ngôi sao. Nó sẽ được tạo tự động dựa trên tiến độ.
Boris Strandjev

1
@Vlad Đọc dòng trả lời đầu tiên tôi đã đề cập từ nơi tôi nhận được điều này.
Vaibhav Jani

4
hoạt động hoàn hảo :) nhưng tôi đã gặp 2 vấn đề .. numStars không hoạt động nữa và tôi không thể làm cho nó lớn hơn một chút ngay cả khi tôi đặt chiều rộng tối đa và tối thiểu
Ahmad Dwaik 'Warlock'

1
Cảm ơn @PiedPiper - điều này giúp tôi tiết kiệm rất nhiều thời gian !! Giải thích tốt nhất bao giờ hết!
Edmond Tamas

70

Chỉ dùng:

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

Thay đổi hệ số tỷ lệ theo nhu cầu của bạn.

Để mở rộng quy mô mà không tạo phần đệm bên trái cũng thêm

android:transformPivotX="0dp"

scaleX scaleY là tốt nhưng để lại phần đệm xấu xí, nếu bạn có thể thoát khỏi phần đệm đó thì đó sẽ là câu trả lời hoàn hảo dễ dàng nhất
Ahmad Dwaik 'Warlock'

đồng thời, họ yêu cầu Android 3.0 / API 11
averasko

6
Tôi giải quyết phần đệm xấu xí (phải) bằng cách codeandroid:scaleX="0.75" android:scaleY="0.75" android:layout_marginRight="-25dp"
hannes ach

1
Mặc dù đó có vẻ là giải pháp đơn giản nhất, nhưng nó không hiệu quả với tôi. Vì một số lý do không có tác dụng. Có phải vì tôi đang dùng Android 5.x?
Nautilus

bạn có thể xóa một số phần đệm thêm bằng cách chỉ định chiều cao của thanh xếp hạng cũ:android:layout_height="40dp"
Manohar Reddy

43

Không cần thêm người nghe vào ?android:attr/ratingBarStyleSmall. Chỉ cần thêm android:isIndicator=falsevà nó sẽ nắm bắt các sự kiện nhấp chuột, ví dụ

<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
isTheicicator là chìa khóa!
cá chết

19

một hệ thống nhỏ do hệ điều hành thực hiện

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

2
Thanh đánh giá không thể nhấp khi đưa ra mã trên.
Sharath

16

áp dụng điều này.

<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
Mặc dù trực quan nó là tuyệt vời. nhấp vào các sự kiện không hoạt động trên giải pháp này. Bạn có cách khắc phục nào không?
Gökhan Barış Aker

4
nếu bạn muốn các nhấp chuột hoạt động, hãy sử dụng android: isIndicator = "false"
D4rWiNS

15

Tôi tìm thấy một giải pháp dễ dàng hơn tôi nghĩ được đưa ra bởi những người ở trên và dễ dàng hơn là tự mình thực hiện. Tôi chỉ đơn giản là tạo một thanh đánh giá nhỏ, sau đó thêm một onTouchListener vào nó. Từ đó tôi tính chiều rộng của nhấp chuột và xác định số lượng sao từ đó. Đã sử dụng nhiều lần, điều khó hiểu duy nhất tôi tìm thấy là bản vẽ của một thanh xếp hạng nhỏ không phải lúc nào cũng bật ra ngay trong một bảng trừ khi tôi đặt nó trong linearLayout (trông đúng trong trình chỉnh sửa, nhưng không phải trên thiết bị) . Dù sao, trong bố trí của tôi:

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

và trong hoạt động của tôi:

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

Tôi mong điều này giúp được người nào khác. Chắc chắn dễ dàng hơn việc tự vẽ một cái (mặc dù tôi thấy nó cũng hoạt động, nhưng tôi chỉ muốn sử dụng các ngôi sao dễ dàng).


Nó hoạt động, và thật dễ dàng ... nhưng các ratingBarStyleSmallngôi sao thực sự quá nhỏ để có thể hữu ích. Tôi nghĩ rằng tôi sẽ phải tự lăn để có được những ngôi sao có kích thước trung gian.
Bia tôi

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>

// thêm các dòng này cho thanh đánh giá nhỏ

style = "?android:attr/ratingBarStyleSmall"

Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Johan

3

Mặc dù câu trả lời của Farry hoạt động, đối với các thiết bị Samsung RatingBar lấy màu xanh lam ngẫu nhiên thay vì định nghĩa của tôi. Vì vậy, sử dụng

style="?attr/ratingBarStyleSmall"

thay thế.

Mã đầy đủ làm thế nào để sử dụng nó:

<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

Câu trả lời tốt nhất cho thanh đánh giá nhỏ

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

2

Sử dụng mã này

<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

Câu trả lời hay nhất tôi nhận được

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

người dùng thích điều này

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

Tăng / Giảm kích thước bằng cách sử dụng giá trị scaleXscaleY


1

sử dụng mã sau đây cho thanh xếp hạng nhỏ với sự kiện 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

Sau rất nhiều nghiên cứu, tôi đã tìm ra giải pháp tốt nhất để giảm kích thước của các thanh xếp hạng tùy chỉnh là lấy kích thước của tiến trình có thể rút ra ở các kích thước nhất định như được đề cập dưới đây:

xxhdpi - 48 * 48 px

xhdpi - 36 * 36 px

hdpi - 24 * 24 px

Và trong phong cách đặt minheight và maxheight là 16 dp cho tất cả Độ phân giải.

Hãy cho tôi biết nếu điều này không giúp bạn có được thanh xếp hạng kích thước nhỏ tốt nhất vì những kích thước này tôi thấy rất tương thích và tương đương với thuộc tính kiểu ratingbar.small.


0

Nó hoạt động với tôi trong thanh đánh giá xml style = "? Android: attr / ratingBarStyleSmall" thêm this.it sẽ hoạt động.


-4

Tôi giải quyết vấn đề này như sau: style = "? Android: attr / ratingBarStyleSmall"


Đây là những gì OP đã thử và các câu trả lời khác đã được đề cập.
Pang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.