1. 程式人生 > >Android評分條控制元件RatingBar自定義背景顏色圖片

Android評分條控制元件RatingBar自定義背景顏色圖片

預設的背景圖片顏色是綠色的,看起來和專案顏色極不統一,所以需要自定義背景圖片。

原理很簡單,就是替換系統預設的三種圖片。

替換方式是使用RatingBar的android:progressDrawable="@drawable/rating_yellow" 屬性進行覆蓋

其中@drawable/rating_yellow內容如下:

Xml程式碼  收藏程式碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layer-list  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"
    >  
  4.     <item android:id="@android:id/background" android:drawable="@drawable/star_empty" />  
  5.     <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/star_half" />  
  6.     <item android:id="@android:id/progress" android:drawable="@drawable/star_full" />  
  7. </layer-list
    >  

需要準備三張圖片,分辨對應全星(star_full)、 半星(star_half)、無星(star_empty)

實際執行效果圖

在Android的開發中,有一個叫做評分控制元件RatingBar,我們可以使用該控制元件做等級劃分、評分等作用,星星形狀顯示,也可以半星級別,我們來看一下評分控制元件如何使用。

佈局檔案中定義控制元件以及屬性,這裡主要需要指定的是總星星數量,和當前的值,也就是總級別跟當前級別的量。

<RatingBar
    android:id="@+id/ratingBar"
    android:numStars="5" //總級別,總分,星星個數
    android:rating="1.5"  //當前級別,分數,星星個數
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
</RatingBar>

評分控制元件中兩個比較重要的方法:

RatingBar.setRating(flaot rating);
RatingBar.getRating();

事件監聽處理:

RatingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener(){
@Override
    public void onRatingChanged(RatingBar ratingBar, float rating,  boolean fromUser) {
           //doing actions
    }
});

Android 中文 API  —— RatingBar 

正文

  一、結構

    public class RatingBar extends AbsSeekBar

    java.lang.Object

      android.widget.ProgressBar

    android.widget.RatingBar

  二、概述

    

  RatingBar是基於SeekBarProgressBar的擴充套件,用星型來顯示等級評定。使用RatingBar的預設大小時,使用者可以觸控/拖動或使用鍵來設定評分,它有兩種樣式(小風格用ratingBarStyleSmall,大風格用ratingBarStyleIndicator),其中大的只適合指示,不適合於使用者互動。

  當使用可以支援使用者互動的RatingBar時,無論將控制元件(widgets)放在它的左邊還是右邊都是不合適的。

  只有當佈局的寬被設定為wrap content時,設定的星星數量(通過函式setNumStars(int)或者在XML的佈局檔案中定義)將顯示出來(如果設定為另一種佈局寬的話,後果無法預知)。

  次級進度一般不應該被修改,因為他僅僅是被當作星型部分內部的填充背景。

  三、巢狀類

  一個回撥函式,當星級進度改變時修改客戶端的星級。

  四、XML屬性

屬性名稱

描述

android:isIndicator

RatingBar是否是一個指示器(使用者無法進行更改)

android:numStars

顯示的星型數量必須是一個整形值,像“100”。

android:rating

預設的評分,必須是浮點型別,像“1.2”。

android:stepSize

評分的步長必須是浮點型別,像“1.2”。

  五、公共方法

public int getNumStars ()

    返回顯示的星型數量

      返回值

   顯示的星型數量

  public RatingBar.OnRatingBarChangeListener getOnRatingBarChangeListener ()

返回值

監聽器(可能為空)監聽評分改變事件

  public float getRating ()

  獲取當前的評分(填充的星型的數量)

  返回值

  當前的評分

  public float getStepSize ()

  獲取評分條的步長

  返回值

  步長

  public boolean isIndicator ()

返回值

 判斷當前的評分條是否僅僅是一個指示器(注:即能否被修改)

  public void setIsIndicator (boolean isIndicator)

  設定當前的評分條是否僅僅是一個指示器(這樣使用者就不能進行修改操作了)

  引數

  isIndicator       Bool值,是否是一個指示器

  public synchronized void setMax (int max)

  設定評分等級的範圍,從0max

  引數

  max  評分條最大範圍。

  public void setNumStars (int numStars)

  設定顯示的星型的數量。為了能夠正常顯示它們,建議將當前widget的佈局寬度設定為

wrap content

  引數

  numStars  星型的數量

  public void setOnRatingBarChangeListener (RatingBar.OnRatingBarChangeListener listener)

  設定當評分等級發生改變時回撥的監聽器

  引數

  listener  監聽器

  public void setRating (float rating)

  設定分數(星型的數量)

  引數

  rating  設定的分數

  public void setStepSize (float stepSize)

  設定當前評分條的步長(step size

  引數

  stepSize 評分條的步進。例如:如果想要半個星星,它的值為0.5


  六、受保護方法

  protected synchronized void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

  權衡 view  content 來決定它的寬度和高度的整齊。它被 呼叫 並且應該被子類所覆蓋,以便提供準確高效的佈局測量。

  尺寸的基本類的實現預設是背景大小,除非通過MeasureSpec允許大的尺寸。子類應該覆蓋 以便提供更好的佈局大小。

    引數

     widthMeasureSpec     受主視窗支配的水平空間要求。這個需求通過 .進行編碼。

       heightMeasureSpec   受主視窗支配的垂直空間要求。這個需求通過 .進行編碼。 

  七、補充

    文章連結

Java檔案

publicclass AndroidRatingBar extends Activity {
   

   @Override
   
publicvoid onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       
final RatingBar ratingBar_Small = (RatingBar)findViewById(R.id.ratingbar_Small);
       
final RatingBar ratingBar_Indicator = (RatingBar)findViewById(R.id.ratingbar_Indicator);
       
final RatingBar ratingBar_default = (RatingBar)findViewById(R.id.ratingbar_default);

       ratingBar_default.setOnRatingBarChangeListener(
new RatingBar.OnRatingBarChangeListener(){

   
publicvoid onRatingChanged(RatingBar ratingBar, float rating,
     
boolean fromUser) {
    ratingBar_Small.setRating(rating);
    ratingBar_Indicator.setRating(rating);
    Toast.makeText(AndroidRatingBar.
this"rating:"+String.valueOf(rating),
      Toast.LENGTH_LONG).show();
   }});
   }
}

XML檔案

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation
="vertical"
   android:layout_width
="fill_parent"
   android:layout_height
="fill_parent"><TextView 
   
android:layout_width="fill_parent"
   android:layout_height
="wrap_content"
   android:text
="@string/hello"/><RatingBar 
   
android:layout_width="wrap_content"
   android:layout_height
="wrap_content"
   style
="?android:attr/ratingBarStyleIndicator"
   android:id
="@+id/ratingbar_Indicator"/><RatingBar 
   
android:layout_width="wrap_content"
   android:layout_height
="wrap_content"
   style
="?android:attr/ratingBarStyleSmall"
   android:id
="@+id/ratingbar_Small"
   android:numStars
="20"/><RatingBar 
   
android:layout_width="wrap_content"
   android:layout_height
="wrap_content"
   style
="?android:attr/ratingBarStyle"
   android:id
="@+id/ratingbar_default"/></LinearLayout>

結束

  本文為"madgoat"和"wallace2010"聯合署名,原因是翻譯重了,不過兩個翻譯得都很好,這樣翻譯重的事件也將隨著管理的完善得意解決,感謝兩位的相互理解,感謝大家的支援!