这次带来一个滑动打分的控件。在做评分功能的时候经常需要一个手指拖动来打分的控件。其实这种控件一百度挺多的,我很久以前也写了一个,这里翻出来跟大家分享一下。
控件命名为
SlideToGradeLayout,只有一个文件,复制粘贴即可用。下面上控件本体:SlideToGradeLayout.java:
public class SlideToGradeLayout extends LinearLayout {
private Context context;
// 星星的宽度
private float iconWidth = 20;
// 星星的高度
private float iconHeight = 20;
// 星星间距
private float iconPadding = 5;
// 当前分数
private float currentScore = 0;
// 星星颗数
private int iconCount = 5;
// 是否锁定滑动,为true时只显示分数,滑动无反应
private boolean isLock = false;
// 是否已初始化
private boolean isInit = false;
// 是否只允许整数打星,为false时可打半星
private boolean isIntegerOnly = false;
// 是否允许打零星
private boolean isZeroAvailable = true;
private int fullIcon = R.drawable.star_full;
private int halfIcon = R.drawable.star_half;
private int emptyIcon = R.drawable.star_empty;
private ArrayList<ImageView> list = new ArrayList<>();
private int[] scoreMode;
// 滑动时的回调
private OnSlidingListener listener;
public SlideToGradeLayout(Context context) {
this(context, null);
}
public SlideToGradeLayout(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public SlideToGradeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
/**
* 初始化方法
* 在设置好需要的参数之后执行
* 至少需要执行一遍此方法才有视图显示
*/
public void init() {
addIcon();
initScoreMode();
showScore(currentScore);
isInit = true;
}
/**
* 刷新显示的星数
*
* @param score 星数
*/
public void refresh(float score) {
currentScore = score;
showScore(currentScore);
}
/**
* 添加星星
*/
private void addIcon() {
list.clear();
removeAllViews();
setOrientation(LinearLayout.HORIZONTAL);
for (int i = 0; i < iconCount; i++) {
ImageView imageView = new ImageView(context);
LayoutParams layoutParams = new LayoutParams(dp2px(iconWidth), dp2px(iconHeight));
if (i == 0) {
layoutParams.setMargins(dp2px(iconPadding), 0