《Android》『RatingBar』- 星等評分元件的基本用法與如何透過 Shape、layer-list 自訂外觀
《Android Developers 參考文獻》
《繼承架構》
extends AbsSeekBar
↳ android.widget.RatingBar
《簡單介紹》
RatingBar 是一種 Android 中內建的星等評價系統,與 SeekBar 一樣,它在使用上繼承自 ProgressBar,也因此 RatingBar 類別中的很多方法均與 ProgressBar 一致,分別有兩種用途,一種是讓使用者可以設定等級評分,另一種則是只顯示評分等級,不接受使用者設定,這邊我們來介紹它的基本用法以及自訂外觀的方式。
➥透過 Selector 與 layer-list 資源檔自訂 RatingBar 的外觀
基本用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package ... import ... public class MainActivity extends Activity { RatingBar mRatingBar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mRatingBar=(RatingBar)findViewById(R.id.ratingBar1); mRatingBar.setMax(100); //設定最大值 mRatingBar.setNumStars(5); //設定最大星型數量 mRatingBar.setStepSize((float) 0.5); //設定步進值 mRatingBar.setRating((float) 3.5); //設定目前顯示的星型數量 mRatingBar.setIsIndicator(true); //設定是否可被使用者修改評分 mRatingBar.setOnRatingBarChangeListener(ratingBarOnRatingBarChange);//設定監聽器 } private RatingBar.OnRatingBarChangeListener ratingBarOnRatingBarChange = new RatingBar.OnRatingBarChangeListener() { @Override public void onRatingChanged(RatingBar ratingBar, float rating,boolean fromUser) { Toast.makeText(getApplicationContext(), "rating: " + rating, Toast.LENGTH_LONG).show(); } }; } |
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <RatingBar android:id="@+id/ratingBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> |
activity_main.xml
以上直接透過程式碼的方式,示範 RatingBar 元件的基本使用方式,並將常用到的設定方法條列如下 –
setMax()、getMax() (android:max)
設定、取得 RatingBar 範圍的最大值。
setNumStars()、getNumStars() (android:numStars)
設定、取得 RatingBar 的最大星型數量(總星級)。
setRating()、gatRating() (android:rating)
設定、取得 RatingBar 目前顯示的星型數量。
setStepSize()、getStepSize() (android:stepSize)
設定、取得 RatingBar 目前的步進值(例如設定為 0.5,則表示每次可更改半顆星)。
setIsIndicator()、isIndicator()
設定、取得 RatingBar 目前是否可被使用者修改評分。
(style=”?android:attr/ratingBarStyleIndicator” 使用者無法修改評分)
(style=”?android:attr/ratingBarStyleSmall” 使用者可以修改評分)
setOnRatingBarChangeListener()
透過 Selector 與 layer-list 資源檔自訂 RatingBar 的外觀
要實作自訂 RatingBar 的外觀,我們必須使用 layer-list 資源檔來設定 android:progressDrawable 屬性,相關程式碼如下 –
1 2 3 4 5 6 7 8 9 10 11 |
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+android:id/background" android:drawable="@drawable/ratingbar_empty" /> <item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/ratingbar_empty" /> <item android:id="@+android:id/progress" android:drawable="@drawable/ratingbar_filled" /> </layer-list> |
progress_layer.xml
我們自訂了一個名為 progress_layer.xml 的 layer-list 資源檔,其中我們必須定義三個帶有特定 id 名稱的 <item> 標籤,且不得任意修改 id 名稱,三個 id 分別是 background、secondaryProgress 以及 progress。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:state_window_focused="true" android:drawable="@drawable/star_empty" /> <item android:state_focused="true" android:state_window_focused="true" android:drawable="@drawable/star_empty" /> <item android:state_selected="true" android:state_window_focused="true" android:drawable="@drawable/star_empty" /> <item android:drawable="@drawable/star_empty" /> </selector> |
ratingbar_empty.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:state_window_focused="true" android:drawable="@drawable/star_filled" /> <item android:state_focused="true" android:state_window_focused="true" android:drawable="@drawable/star_filled" /> <item android:state_selected="true" android:state_window_focused="true" android:drawable="@drawable/star_filled" /> <item android:drawable="@drawable/star_filled" /> </selector> |
ratingbar_filled.xml
我們在這三個 <item> 標籤中,分別將 android:drawable 屬性指向了 ratingbar_empty 與 ratingbar_filled 兩個 selector 資源檔,並在這兩個資源檔中定義了在不同觸碰狀態下所使用的圖片。
(此範例中用到了自訂的 star_empty 與 star_filled 兩張圖片,分別代表沒有星星的圖案以及一顆星的圖案,若評分為半星時,系統會自己將兩張圖分成一半顯示,達到半星的效果。)
延伸閱讀:
請問自訂圖案的ratingBar要怎麼調整圖案大小呢
因為圖案太大只能顯示一小部分…
只能調整原始圖檔嗎?