จะทำให้ RatingBar เล็กลงได้อย่างไร?


134

ฉันได้เพิ่ม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"

แต่ผลลัพธ์น้อยเกินไปและไม่สามารถกำหนดอัตราด้วยคุณสมบัตินี้ได้

ฉันจะทำอย่างไร?

คำตอบ:


106

วิดเจ็ต RatingBar ดีฟอลต์คือ sorta 'ง่อย

แหล่งที่มาอ้างอิงถึงสไตล์ " ?android:attr/ratingBarStyleIndicator" นอกเหนือจาก " ?android:attr/ratingBarStyleSmall" ที่คุณคุ้นเคยอยู่แล้ว ratingBarStyleIndicatorเล็กกว่าเล็กน้อย แต่ก็ยังค่อนข้างน่าเกลียดและความคิดเห็นระบุว่าสไตล์เหล่านี้ "ไม่รองรับการโต้ตอบ"

คุณน่าจะดีกว่าที่จะหมุนตัวเอง มีคำแนะนำที่ดูดีที่http://kozyr.zydako.net/2010/05/23/pretty-ratingbar/ซึ่งแสดงวิธีการทำเช่นนี้ (ฉันยังไม่ได้ทำเอง แต่จะพยายามในอีกสักวัน)

โชคดี!

ปล. ขออภัยกำลังจะโพสต์ลิงค์ไปยังแหล่งที่มาเพื่อให้คุณเข้าไปดู แต่ฉันเป็นผู้ใช้ใหม่และไม่สามารถโพสต์มากกว่า 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

เนื้อหา @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 / secondaryProgress" android: drawable = "@ drawable / star_empty" /> be "@ drawable / star_half" /> หรืออะไรก็ได้ที่คุณเรียก
StackOverflowed

8
ขอบคุณมาก อย่างไรก็ตามเป็นเพียงความคิดเห็นเล็ก ๆ : คุณไม่จำเป็นต้องมีภาพครึ่งดาว มันจะถูกสร้างขึ้นโดยอัตโนมัติตามความคืบหน้า
Boris Strandjev

1
@ วลาดอ่านคำตอบบรรทัดแรกที่ฉันพูดถึงจากที่ฉันได้รับสิ่งนี้
Vaibhav Jani

4
ทำงานได้อย่างสมบูรณ์ :) แต่ฉันมี 2 ปัญหา .. numStars ไม่ทำงานอีกต่อไปและฉันไม่สามารถทำให้มันใหญ่ขึ้นได้อีกสักหน่อยแม้ว่าฉันจะตั้งค่าความกว้างสูงสุดและต่ำสุดก็ตาม
Ahmad Dwaik 'Warlock'

1
ขอบคุณ @PiedPiper - ช่วยให้ฉันประหยัดเวลาได้มาก !! อธิบายได้ดีที่สุด!
Edmond Tamas

70

เพียงใช้:

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

เปลี่ยนสเกลแฟกเตอร์ตามความต้องการของคุณ

หากต้องการปรับขนาดโดยไม่ต้องสร้างช่องว่างด้านซ้ายให้เพิ่ม

android:transformPivotX="0dp"

scaleX scaleY เป็นสิ่งที่ดี แต่ปล่อยให้มีช่องว่างภายในที่น่าเกลียดถ้าคุณสามารถกำจัดช่องว่างนั้นได้มันจะเป็นคำตอบที่สมบูรณ์แบบที่ง่ายที่สุด
Ahmad Dwaik '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 หรือเปล่า?
Nautilus

คุณสามารถลบช่องว่างเพิ่มเติมบางส่วนได้โดยระบุความสูงของแถบคะแนนเช่นandroid:layout_height="40dp"
Manohar Reddy

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 คือกุญแจสำคัญ!
deadfish

19

ตัวเล็กใช้ระบบปฏิบัติการ

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

2
แถบคะแนนไม่สามารถคลิกได้เมื่อให้รหัสด้านบน
Sharath

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ökhanBarış 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ดวงดาวนั้นเล็กเกินไปที่จะมีประโยชน์จริงๆ ฉันคิดว่าฉันจะต้องหมุนตัวเองเพื่อให้ได้ดาวที่มีขนาดกลาง
Beer Me

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

แม้ว่าข้อมูลโค้ดนี้อาจเป็นวิธีแก้ปัญหา แต่การมีคำอธิบายจะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้มาก โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ
Johan

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

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

คำตอบที่ดีที่สุดที่ฉันได้รับ

  <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ค่า



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

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 พิกเซล

และอย่างมีสไตล์ให้ใส่ minheight และ maxheight เป็น 16 dp สำหรับความละเอียดทั้งหมด

โปรดแจ้งให้เราทราบหากสิ่งนี้ไม่ช่วยให้คุณได้รับแถบคะแนนขนาดเล็กที่ดีที่สุดเนื่องจากขนาดเหล่านี้ฉันพบว่าเข้ากันได้มากและเทียบเท่ากับแอตทริบิวต์รูปแบบ ratingbar.small


0

มันใช้งานได้สำหรับฉันในแถบคะแนน xml style = "? android: attr / ratingBarStyleSmall" เพิ่มสิ่งนี้มันจะทำงาน


-4

ฉันแก้ปัญหาต่อไปนี้ style = "? android: attr / ratingBarStyleSmall"


นี่คือสิ่งที่ OP ได้พยายามแล้วและคำตอบอื่น ๆ ได้กล่าวไปแล้ว
ปาง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.