1.自定义ProgressBarView
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; // 默认总数为16private 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;}@Overrideprotected 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() {@Overridepublic 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());}
}
2.XML引用
<com.afison.newfault.view.ProgressBarViewandroid:id="@+id/pb_ele"android:layout_width="108dp"android:layout_height="108dp"android:layout_marginEnd="@dimen/margin_big"android:layout_marginTop="@dimen/margin_medium"android:layout_marginBottom="@dimen/margin_medium"></com.afison.newfault.view.ProgressBarView>
3.更新UI
pbEle.setColor(getResources().getColor(R.color.pbBlue));pbEle.setName("电流测点");pbEle.setTotal(16);pbEle.setProgress(14);pbEle.start();
4.效果展示