項目在我的GITHUB上 mirsfang的GitHub
一個簡單的自定義View ,爲了一個 比較奇葩的需求而搞出來的,他的功能就是能讓你自己設置圖片和圖片的大小以及星星的數量,是一個組合型的自定義View,繼承自
LinearLayout,他的屬性有
<declare-styleable name="RatingBar" tools:ignore="ResourceName">
<!--尺寸值-->
<attr name="starImageSize" format="dimension"/>
<attr name="starCount" format="integer"/>
<!--資源文件值-->
<attr name="starEmpty" format="reference"/>
<!--資源文件值-->
<attr name="starFill" format="reference"/>
<!--資源文件值-->
<attr name="starHalf" format="reference"/>
<!--boolean值-->
<attr name="clickable" format="boolean"/>
<!--改變樣式的值-->
<attr name="changeTo" format="integer"></attr>
</declare-styleable>
實現的代碼
package com.example.mirsfang.ratingbardemo;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.math.BigDecimal;
/**
* Created by Mirs on 2016/4/11.
*
* add halfstar show
*
* Correction clickEvent from Xml
*/
public class RatingBar extends LinearLayout {
private boolean mClickable;
private int starCount;
private OnRatingChangeListener onRatingChangeListener;
private float starImageSize;
private Drawable starEmptyDrawable;
private Drawable starFillDrawable;
private Drawable starHalfDrawable;
//需要改變的地方
private Changed changed;
//需要改變的地方
private float a=0;
/**
* 設置半顆星星的圖片
* */
public void setStarHalfDrawable(Drawable starHalfDrawable) {
this.starHalfDrawable = starHalfDrawable;
}
/**
* 當星星被點擊時候的回調
* */
public void setOnRatingChangeListener(OnRatingChangeListener onRatingChangeListener) {
this.onRatingChangeListener = onRatingChangeListener;
}
/**
* 是否能被點擊
* */
public void setmClickable(boolean clickable) {
this.mClickable = clickable;
}
/**
* 設置星星的圖片
* */
public void setStarFillDrawable(Drawable starFillDrawable) {
this.starFillDrawable = starFillDrawable;
}
/***
*
* 設置星星的背景
*/
public void setStarEmptyDrawable(Drawable starEmptyDrawable) {
this.starEmptyDrawable = starEmptyDrawable;
}
/***
* 設置星星的大小
*
/
public void setStarImageSize(float starImageSize) {
this.starImageSize = starImageSize;
}
/**
* @param context
* @param attrs
*/
public RatingBar(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(LinearLayout.HORIZONTAL);
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBar);
starImageSize = mTypedArray.getDimension(R.styleable.RatingBar_starImageSize, 20);
starCount = mTypedArray.getInteger(R.styleable.RatingBar_starCount, 5);
starEmptyDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starEmpty);
starFillDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starFill);
starHalfDrawable=mTypedArray.getDrawable(R.styleable.RatingBar_starHalf);
mClickable=mTypedArray.getBoolean(R.styleable.RatingBar_clickable,true);
for (int i = 0; i < starCount; ++i) {
ImageView imageView = getStarImageView(context, attrs);
imageView.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
if (mClickable) {
a+=0.5f;
setStar(indexOfChild(v) + a);
if (onRatingChangeListener != null) {
onRatingChangeListener.onRatingChange(indexOfChild(v) + a);
}
if(a==1){
a=0;
}
}
}
}
);
addView(imageView);
}
}
/**
* @param context
* @param attrs
* @return
*/
private ImageView getStarImageView(Context context, AttributeSet attrs) {
ImageView imageView = new ImageView(context);
ViewGroup.LayoutParams para = new ViewGroup.LayoutParams(
Math.round(starImageSize),
Math.round(starImageSize)
);
imageView.setLayoutParams(para);
imageView.setPadding(0, 0, 5, 0);
imageView.setImageDrawable(starEmptyDrawable);
imageView.setMaxWidth(10);
imageView.setMaxHeight(10);
return imageView;
}
/**
* 設置要改變的數據
* */
public void setChanged(Changed changed){
this.changed=changed;
}
public Changed getChanged(){
return new Changed();
}
/**
* setting start
*
* @param starCount
*/
public void setStar(float starCount) {
//浮點數的整數部分
int fint = (int) starCount;
BigDecimal b1 = new BigDecimal(Float.toString(starCount));
BigDecimal b2 = new BigDecimal(Integer.toString(fint));
//浮點數的小數部分
float fPoint = b1.subtract(b2).floatValue();
starCount = fint > this.starCount ? this.starCount : fint;
starCount = starCount < 0 ? 0 : starCount;
//drawfullstar
if(changed!=null&&changed.getPosintion()>=0){
if(b1.floatValue()<=changed.getPosintion()&&changed.changeDrawable!=null){
for (int i = 0; i < starCount; ++i) {
((ImageView) getChildAt(i)).setImageDrawable(changed.changeDrawable);
}
}else{
for (int i = 0; i < starCount; ++i) {
((ImageView) getChildAt(i)).setImageDrawable(starFillDrawable);
}
}
}else{
for (int i = 0; i < starCount; ++i) {
((ImageView) getChildAt(i)).setImageDrawable(starFillDrawable);
}
}
//drawhalfstar
if (fPoint > 0) {
if(changed!=null&&changed.getPosintion()>=0){
if(b1.floatValue()<=changed.getPosintion()&&changed.changeDrawable!=null) {
((ImageView) getChildAt(fint)).setImageDrawable(changed.changeHarlfDrawable);
}else {
((ImageView) getChildAt(fint)).setImageDrawable(starHalfDrawable);
}
}else {
((ImageView) getChildAt(fint)).setImageDrawable(starHalfDrawable);
}
//drawemptystar
for (int i = this.starCount - 1; i >= starCount + 1; --i) {
((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
}
} else {
//drawemptystar
for (int i = this.starCount - 1; i >= starCount; --i) {
((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
}
}
}
/**
* change stat listener
*/
public interface OnRatingChangeListener {
void onRatingChange(float RatingCount);
}
/**
* 需要改變的圖片的座標和圖片
* */
public class Changed{
private int posintion=-1;
private Drawable changeDrawable;
private Drawable changeHarlfDrawable;
public int getPosintion() {
return posintion;
}
public void setPosintion(int posintion) {
this.posintion = posintion;
}
public Drawable getChangeDrawable() {
return changeDrawable;
}
public void setChangeDrawable(Drawable changeDrawable) {
this.changeDrawable = changeDrawable;
}
public Drawable getChangeHarlfDrawable() {
return changeHarlfDrawable;
}
public void setChangeHarlfDrawable(Drawable changeHarlfDrawable) {
this.changeHarlfDrawable = changeHarlfDrawable;
}
}
}
在佈局中引用的時候在最外層佈局引入
xmlns:mirsfang="http://schemas.android.com/apk/res-auto"
然後 <com.example.mirsfang.ratingbardemo.RatingBar
android:layout_marginTop="50dp"
android:layout_gravity="center"
android:id="@+id/ratingbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
mirsfang:clickable="true"
mirsfang:starEmpty="@drawable/grabhb_ash"
mirsfang:starFill="@drawable/grabhb_red"
mirsfang:starHalf="@drawable/grabhb_halfred"
mirsfang:starImageSize="30dp"
></com.example.mirsfang.ratingbardemo.RatingBar>
在MainActivity中
RatingBar mRatingBar = (RatingBar) findViewById(R.id.ratingbar);
//點擊之後的回調
mRatingBar.setOnRatingChangeListener(
new RatingBar.OnRatingChangeListener() {
@Override
public void onRatingChange(float RatingCount) {
Log.e(TAG,RatingCount+"");
}
}
);
//優先設置一定數量下的星星樣式
RatingBar.Changed changed=mRatingBar.getChanged();
changed.setPosintion(2);
changed.setChangeDrawable(getResources().getDrawable(R.drawable.grabhb_yellow));
changed.setChangeHarlfDrawable(getResources().getDrawable(R.drawable.grabhb_yellowhalf));
mRatingBar.setChanged(changed);
//設置星星
mRatingBar.setStar(a.floatValue());
//設置正常下的星星的樣式
mRatingBar.setmClickable(true);
mRatingBar.setStarImageSize(16f);
mRatingBar.setStarEmptyDrawable(getResources().getDrawable(R.drawable.grabhb_ash));
mRatingBar.setStarFillDrawable(getResources().getDrawable(R.drawable.grabhb_red));
mRatingBar.setStarHalfDrawable(getResources().getDrawable(R.drawable.grabhb_halfred));
注意要先設置一定數量下的星星樣式,