java
复制代码
public class ProgressBarView extends View {
private Paint mPaintBack;
private Paint mPaint;
private Paint mPaintText;
private float process;
int strokeWidth = 3;//圈宽度
int textSize= 17;//字大小
private long duration = 1000;
private float startDegree = 0;
private float endDegree = 360;
private float total = 16; // 默认总数为16
private int color = Color.GRAY; // 默认颜色为灰色
private String name = "在线测点";
private String number = "0";
public ProgressBarView(Context context) {
super(context);
init();
}
public ProgressBarView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public ProgressBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaintBack = new Paint();
mPaintBack.setColor(Color.GRAY);
mPaintBack.setStyle(Paint.Style.STROKE);
mPaintBack.setAntiAlias(true);
mPaintBack.setStrokeCap(Paint.Cap.ROUND);
mPaintBack.setStrokeWidth(strokeWidth);
mPaint = new Paint();
mPaint.setColor(color);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(strokeWidth);
mPaintText = new Paint();
mPaintText.setAntiAlias(true);
mPaintText.setStyle(Paint.Style.FILL_AND_STROKE);
mPaintText.setColor(color);
mPaintText.setStrokeCap(Paint.Cap.ROUND);
mPaintText.setTextSize(sp2px((int)textSize));
}
public void setStrokeWidth(int width) {
strokeWidth = width;
}
public void setTextSize(int textSize) {
this.textSize = textSize;
}
public void setDuration(long duration) {
this.duration = duration;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 创建圆环矩形
RectF rectF = new RectF(strokeWidth, strokeWidth, getWidth() - strokeWidth, getHeight() - strokeWidth);
// 画出背景进度条
canvas.drawArc(rectF, 0, 360, false, mPaintBack);
// 画进度条
canvas.drawArc(rectF, 0, process, false, mPaint);
// 设置文字在canvas中的位置
Paint.FontMetrics fm = mPaintText.getFontMetrics();
int mTxtWidth = (int) mPaintText.measureText(number, 0, number.length());
int mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);
int x = getWidth() / 2 - mTxtWidth / 2;
int y = getHeight() / 2;
canvas.drawText(number, x, y, mPaintText);
canvas.drawText(name, x-(int) (mPaintText.measureText(name, 0, name.length())/3), y + mTxtHeight, mPaintText);
}
/**
* 设置传入总测点数
*/
public void setTotal(float total) {
this.total = total;
}
/**
* 设置传入name
*/
public void setName(String name) {
this.name = name;
}
/**
* 设置传入颜色
*/
public void setColor(int color) {
this.color = color;
mPaint.setColor(color);
mPaintText.setColor(color);
}
/**
* 设置传入测点数
*/
public void setProgress(float progress) {
float angle = (progress / total) * 360;
startDegree = 0;
endDegree = angle;
// 更新number的值
number = String.valueOf((int)progress);
invalidate();
}
/**
* 设置动画效果
*/
public void start() {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(startDegree, endDegree);
valueAnimator.setDuration(duration);
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
process = (int)value;
invalidate();
}
});
valueAnimator.start();
}
private int sp2px(int sp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
getResources().getDisplayMetrics());
}
}