带动画的圆形进度条

xiaoxiao2021-02-27  221

1.使用

<com.ycx.driver.utils.widget.view.ProgressArc android:layout_width="@dimen/width_80" android:layout_height="@dimen/width_80" android:layout_marginTop="@dimen/margin_20" progressArc:progressValue="3" progressArc:textColor="@color/color_blue" progressArc:textSize="16sp" progressArc:totalValue="7" />

2.定义属性

<declare-styleable name="ProgressArc"> <attr name="progressValue" format="integer" /> <attr name="totalValue" format="integer" /> <attr name="textValue" format="string" /> <attr name="textSize" format="dimension" /> <attr name="textColor" format="color" /> </declare-styleable>

3.自定义view

public class ProgressArc extends View { private Paint paint; //圆环画笔 private Paint arcPaint; //圆弧画笔 private Paint textPaint; //文字画笔 private int roundWidth;//圆环宽度 // private int[] doughnutColors = new int[]{Color.parseColor("#3BB7FF"), Color.parseColor("#1B8BFF")}; private int[] doughnutColors = new int[]{Color.parseColor("#3BB7FF"), Color.parseColor("#1B8BFF"), Color.parseColor("#3BB7FF")}; public ProgressArc(Context context) { super(context); init(context, null); } public ProgressArc(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context, attrs); } public ProgressArc(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } private void init(Context context, AttributeSet attrs) { TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ProgressArc, 0, 0); progressValue = a.getInt(R.styleable.ProgressArc_progressValue, 0); totalValue = a.getInt(R.styleable.ProgressArc_totalValue, 0); float textSize = a.getDimension(R.styleable.ProgressArc_textSize, 12); int textColor = a.getColor(R.styleable.ProgressArc_textColor, Color.BLUE); roundWidth = 20; paint = new Paint(); paint.setColor(Color.GRAY); //设置圆环的颜色 paint.setStyle(Paint.Style.STROKE); //设置空心 paint.setStrokeWidth(roundWidth); //设置圆环的宽度 paint.setAntiAlias(true); //消除锯齿 arcPaint = new Paint(); arcPaint.setStrokeCap(Paint.Cap.ROUND); arcPaint.setColor(Color.BLUE); //设置圆环的颜色 arcPaint.setStyle(Paint.Style.STROKE); //设置空心 arcPaint.setStrokeWidth(roundWidth); //设置圆环的宽度 arcPaint.setAntiAlias(true); //消除锯齿 textPaint = new Paint(); textPaint.setColor(textColor); //设置文字的颜色 textPaint.setStrokeWidth(3); //设置文字的畫筆的宽度 textPaint.setTextSize(textSize); setProgress(progressValue, totalValue); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { width = 200; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { height = 200; } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); SweepGradient sweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2, doughnutColors, null); //旋转 不然是从0度开始渐变 Matrix matrix = new Matrix(); matrix.setRotate(-90, getWidth() / 2, getHeight() / 2); sweepGradient.setLocalMatrix(matrix); arcPaint.setShader(sweepGradient); /** * 画最外层的大圆环 */ int centre = getWidth() / 2; //获取圆心的x坐标 int radius = (centre - roundWidth / 2); //圆环的半径 canvas.drawCircle(centre, centre, radius, paint); //画出圆环 /** * 画圆弧 * */ RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); //用于定义的圆弧的形状和大小的界限 // Logger.i("draw current = " + currentArc); canvas.drawArc(oval, -90, currentArc, false, arcPaint); //根据进度画圆弧 /** * 绘制文字 */ float textWidth = textPaint.measureText(progressValue + "/" + totalValue); int textHeight = (int) (Math.ceil(textPaint.getFontMetrics().descent - textPaint.getFontMetrics().ascent) + 2); canvas.drawText(progressValue + "/" + totalValue, getWidth() / 2 - textWidth / 2, getHeight() / 2 + textHeight / 4, textPaint); } private int progressValue = 0; private int totalValue = 0; private int currentArc; public void setProgress(int progressValue, int totalValue) { this.progressValue = progressValue; this.totalValue = totalValue; ValueAnimator animator = ValueAnimator.ofFloat(0, (float) progressValue / totalValue); animator.setInterpolator(new DecelerateInterpolator()); animator.setDuration(2000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { currentArc = (int) (360 * (float) animation.getAnimatedValue()); // Logger.i("current = " + currentArc); invalidate(); } }); animator.start(); }
转载请注明原文地址: https://www.6miu.com/read-9186.html

最新回复(0)