本文實例為大家分享了Android自定義星星可滑動評分控件的具體方法,供大家參考,具體內(nèi)容如下
超過十余年行業(yè)經(jīng)驗,技術(shù)領(lǐng)先,服務至上的經(jīng)營模式,全靠網(wǎng)絡和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務范圍包括了:網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計,成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡托管,小程序定制開發(fā),微信開發(fā),成都app開發(fā),同時也可以讓客戶的網(wǎng)站和網(wǎng)絡營銷和我們一樣獲得訂單和生意!
此控件通過線性布局結(jié)合ImageView來實現(xiàn)。
具有展示分數(shù),滑動評分功能,可設(shè)置0-10分,自行設(shè)置星星圖片,是否可點擊與滑動,星星間距。
效果如下:
需準備好下面三張圖片
先看自定義屬性:
<?xml version="1.0" encoding="utf-8"?>
布局文件
<?xml version="1.0" encoding="utf-8"?>
第一個控件star:ratable設(shè)置為false,只具備展示功能。第二個為true,可進行滑動評分并把分數(shù)顯示到TextView上。
下面是控件代碼
public class StarRatingView extends LinearLayout{ private Drawable on,off,half; //星星三種圖片 private boolean ratable; //是否點擊滑動 private float padding; //星星之間間距 private Listlist; //存放五顆星星 private float points[] = new float[11]; //0-10分點的x坐標,index為分數(shù),值為此分數(shù)為坐標 private float starWidth; //設(shè)置的星星圖片寬度 private float halfStarWidth; //半個星星寬度 private int paddingLeft; //控件左padding private OnRateChangeListener onRateChangeListener; public StarRatingView(Context context) { super(context); } public StarRatingView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.StarRatingView); on = array.getDrawable(R.styleable.StarRatingView_stat_on); off = array.getDrawable(R.styleable.StarRatingView_stat_off); half = array.getDrawable(R.styleable.StarRatingView_stat_half); ratable = array.getBoolean(R.styleable.StarRatingView_ratable, false); halfStarWidth = on.getIntrinsicWidth() / 2; starWidth = on.getIntrinsicWidth(); padding = array.getDimension(R.styleable.StarRatingView_star_padding, starWidth / 3); paddingLeft = getPaddingLeft(); list = new ArrayList<>(); ImageView imageView; //初始化五個星星,并通過points數(shù)組把分數(shù)與坐標對應起來 for(int i=0;i<5;i++){ imageView = new ImageView(context); LinearLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); if(i!=0&&i!=4) { //設(shè)置間距 layoutParams.setMargins((int) padding / 2, 0, (int) padding / 2, 0); //分數(shù)點所在的x坐標 points[i*2] = i*starWidth+i*padding; points[i*2+1] = points[i*2]+halfStarWidth/2; } //第一個左邊和最后一個右邊不設(shè)置間距 if(i==0){ layoutParams.setMargins(0, 0, (int) padding / 2, 0); points[0] = 0; points[1] = halfStarWidth; } if(i==4){ layoutParams.setMargins((int) padding / 2, 0, 0, 0); points[i*2] = i*starWidth+i*padding; points[i*2+1] = points[i*2]+halfStarWidth/2; points[10] = points[9]+halfStarWidth/2; } imageView.setLayoutParams(layoutParams); imageView.setImageDrawable(off); list.add(imageView); addView(list.get(i)); } setOrientation(LinearLayout.HORIZONTAL); array.recycle(); } /** *根據(jù)分數(shù)顯示星星 * @param rate */ public void setRate(int rate){ removeAllViews(); int count = rate/2; boolean isOdd; if(rate%2==0){ isOdd = false; }else{ isOdd = true; } for(int i=0;i realPosition){ return i; } } //如果循環(huán)結(jié)束即為右滑超出最大值,返回10分 return 10; } /** * 評分改變的回調(diào) */ public interface OnRateChangeListener{ void onRateChange(int rate); } }
基本實現(xiàn)原理是通過坐標計算分數(shù),然后根據(jù)分數(shù)設(shè)置每個ImageView顯示不同三張星星圖片,根據(jù)ratable變量判斷是否處理觸摸事件,通過觸摸位置在坐標數(shù)組point[]的位置,確定index,即為分數(shù)。并通過OnRateChangeListener通知分數(shù)的改變。
最后為Activity代碼
public class MainActivity extends AppCompatActivity { private int count; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final StarRatingView srv = (StarRatingView) findViewById(R.id.srv); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { count++; srv.setRate(count); } }); final TextView tv = (TextView) findViewById(R.id.tv); StarRatingView srv_ratable = (StarRatingView) findViewById(R.id.srv_ratable); srv_ratable.setOnRateChangeListener(new StarRatingView.OnRateChangeListener() { @Override public void onRateChange(int rate) { tv.setText(rate+"分"); } }); } }
GitHub地址StarRatingView
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。