今天在项目中写到一个类似美团、滴滴这种市面上常用的带星评价的需求,于是拿到需求的第一反应就是去找度娘了,然后了解到google有一种控件叫RatingBar,因为以前没有做过类似的需求,所以第一反应很开森。但是当拿到用的时候才发现啊并不是那么的如人意,因为这个扩展性太弱,基本上不能满足大众的自定义需求。 然后由于自己项目的需求,又找了一些其它的帖子看了下,感觉都不怎么适合,然后去看了RatingBar的源码之后决定自己动手自定义一个。先看效果图:
废话不多说 ,直接怼代码:
这是drawable文件 这里面主要是设置选中时候的star的样式以及没有选中时候的样式:
<?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_20x20_hl" />
<item android:id="@android:id/secondaryProgress"
android:drawable="@drawable/star_20x20_n" />
<item android:id="@android:id/progress"
android:drawable="@drawable/star_20x20_n" />
</layer-list>
接下来是自定义类里需要的attrs
<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="RatingBar">
<!--尺寸值-->
<attr name="starImageSize" format="dimension" />
<!--星星间距-->
<attr name="starPadding" 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" />
<!--当前进度float值-->
<attr name="starStep" format="float" />
<!--每次进度方式的值,整星还是半星-->
<attr name="stepSize">
<enum name="Half" value="0" />
<enum name="Full" value="1" />
</attr>
</declare-styleable>
</resources>
然后直接贴出自定义类 继承LinearLayout
import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import com.hconline.antapp_client.R; import java.math.BigDecimal; /** * Created by dylan on 2015/6/11. * 自定义打分控件RatingBar * 可以自定义星星大小和间距 * Correction clickEvent from Xml */ public class RatingBar extends LinearLayout { private int starNum; public float getStarNum() { return starNum; } public void setStarNum(int starNum) { this.starNum = starNum; } /** * 是否可点击 */ private boolean mClickable; /** * 星星总数 */ private int starCount; /** * 星星的点击事件 */ private OnRatingChangeListener onRatingChangeListener; /** * 每个星星的大小 */ private float starImageSize; /** * 每个星星的间距 */ private float starPadding