这篇是给RatingBarView添加触摸事件,添加触摸事件就是重写onTouchEvent(MotionEvent event)
关键就是如何判断点在某个星星上(获取点击点的x坐标,与星星的位置作比较,就可以知道点在哪个星星上了)
实现关键代码:
//处理点击
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!mStarClickable) {
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
checkUpdate(MotionEvent.ACTION_DOWN, event.getX());
break;
case MotionEvent.ACTION_MOVE:
getParent().requestDisallowInterceptTouchEvent(true);
checkUpdate(MotionEvent.ACTION_MOVE, event.getX());
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
//记录临时的星星进度
private float tempStarRating;
private void checkUpdate(int action, float x) {
for (int i=0;i<mStarRect.length;i++) {
//是否在当前星星上
if (mStarRect[i].left <= x && mStarRect[i].right >= x) {
//是否过半
if (x <= mStarRect[i].left + mStarRect[i].width()/2) {
tempStarRating = i+0.5f;
} else {
tempStarRating = i+1;
}
if (action == MotionEvent.ACTION_DOWN) {
mStarRating = tempStarRating;
invalidate();
if (mOnRatingBarChangeListener != null)
mOnRatingBarChangeListener.onRatingChanged(this,mStarRating,true);
} else {
if (mStarRating != tempStarRating) {
mStarRating = tempStarRating;
invalidate();
if (mOnRatingBarChangeListener != null)
mOnRatingBarChangeListener.onRatingChanged(this,mStarRating,true);
}
}
break;
}
}
}
到此,一个功能完善的评分控件完成了(可设置圆角渐变背景,可设置星星之间的空隙,可设置进度为整星或半星,未选择与选中整星、选中半星图片和大小自定义)
代码:https://github.com/wudengwei/RatingBarView