Android开发中,经常要实现星星的评分效果如下图,所以今天就记录下来,以便他人使用。
1、自定义RatingBar代码:
package com.example.myapplicationtest;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* @author
* @package
* @desc 评星
* @date 2019/7/05 18:44
* @copyright
* @company
*/
public class RatingBar extends View {
private static final String TAG = "AirRatingBar";
/**
* 默认,半个,全部选中
*/
private Bitmap mRatingNormal, mRatingHalf, mRatingSelected;
/**
* 总数
*/
private int mRatingTotalNum = 5;
/**
* 选中的数量
*/
private float mRatingSelectedNumber;
/**
* 是否画全部
*/
private Status status = Status.FULL;
/**
* 是否画全部
* true 画全部
* false 画半个
*/
private boolean isFull;
/**
* 状态变化监听
*/
private OnStarChangeListener mOnStarChangeListener;
/**
* 画笔
*/
private Paint mPaint;
/**
* 间距
*/
private int mRatingDistance;
/**
* 宽和高
*/
private float mRatingWidth;
private float mRatingHeight;
/**
* 是否可选中
*/
private boolean selectable;
public RatingBar(Context context) {
this(context, null);
}
public RatingBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RatingBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
initTypeArray(context, attrs);
}
/**
* 画笔
*/
private void initPaint() {
mPaint = new Paint();
}
/**
* 属性
*
* @param context
* @param attrs
*/
private void initTypeArray(Context context, AttributeSet attrs) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.AirRatingBar);
// 未选中的图片资源
int starNormalId = array.getResourceId(R.styleable.AirRatingBar_ratingDefault, 0);
if (starNormalId == 0) {
throw new IllegalArgumentException("请设置属性 starNormal");
}
mRatingNormal = getBitmap(context, starNormalId);
// 选中一半的图片资源
int starHalfId = array.getResourceId(R.styleable.AirRatingBar_ratingHalf, 0);
if (starHalfId != 0) {
mRatingHalf = getBitmap(context, starHalfId);
}
// 选中全部的图片资源
int starSelectedId = array.getResourceId(R.styleable.AirRatingBar_ratingSelect, 0);
if (starSelectedId == 0) {
throw new IllegalArgumentException("请设置属性 starSelected");
}
mRatingSelected = getBitmap(context, starSelectedId);
// 如果没设置一半的图片资源,就用全部的代替
if (starHalfId == 0) {
mRatingHalf = mRatingSelected;
}
mRatingTotalNum = array.getInt(R.styleable.AirRatingBar_ratingTotalNum, mRatingTotalNum);
mRatingSelectedNumber = array.getFloat(R.styleable.AirRatingBar_ratingDefaultSelectNum, mRatingSelectedNumber);
mRatingDistance = (int) array.getDimension(R.styleable.AirRatingBar_ratingDistance, 0);
mRatingWidth = array.g