首先是自定义画圆
public class CircleBarView extends View {
private Paint bgPaint;//绘制背景圆弧的画笔
private Paint progressPaint;//绘制圆弧的画笔
private RectF mRectF;//绘制圆弧的矩形区域
private CircleAnim anim;
private float progressNum;//可以更新的进度条数值
private float maxNum;//进度条最大值
private int progressColor;//进度条圆弧颜色
private int bgColor;//背景圆弧颜色
private float startAngle;//背景圆弧的起始角度
private float sweepAngle;//背景圆弧扫过的角度
private float barWidth;//圆弧进度条宽度
private int defaultSize;//自定义View默认的宽高
private float progressSweepAngle;//进度条圆弧扫过的角度
private TextView textView;
private OnAnimationListener onAnimationListener;
public CircleBarView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleBarView);
progressColor = typedArray.getColor(R.styleable.CircleBarView_progress_color,Color.GREEN);
bgColor = typedArray.getColor(R.styleable.CircleBarView_bg_color,Color.GRAY);
startAngle = typedArray.getFloat(R.styleable.CircleBarView_start_angle,0);
sweepAngle = typedArray.getFloat(R.styleable.CircleBarView_sweep_angle,360);
barWidth = typedArray.getDimension(R.styleable.CircleBarView_bar_width,DpOrPxUtils.dip2px(context,100));
typedArray.recycle();
progressNum = 0;
maxNum = 100;
defaultSize = DpOrPxUtils.dip2px(context,100);
mRectF = new RectF();
progressPaint = new Paint();
progressPaint.setStyle(Paint.Style.STROKE);//只描边,不填充
progressPaint.setColor(progressColor);
progressPaint.setAntiAlias(true);//设置抗锯齿
progressPaint.setStrokeWidth(barWidth);
progressPaint.setStrokeCap(Paint.Cap.ROUND);//设置画笔为圆角
bgPaint = new Paint();
bgPaint.setStyle(Paint.Style.STROKE);//只描边,不填充
bgPaint.setColor(bgColor);
bgPaint.setAntiAlias(true);//设置抗锯齿
bgPaint.setStrokeWidth(barWidth);
bgPaint.setStrokeCap(Paint.Cap.ROUND);
anim = new CircleAnim();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = measureSize(defaultSize, heightMeasureSpec);
int width = measureSize(defaultSize, widthMeasureSpec);
int min = Math.min(width, height);// 获取View最短边的长度
setMeasuredDimension(min, min);// 强制改View为以最短边为长度的正方形
if(min >= barWidth*2){
mRectF.set(barWidth/2,barWidth/2,min-barWidth/2,min-barWidth/2);
}
}
@Override
protected void onDraw(Canvas canvas