创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
创新互联公司是一家专注于成都网站设计、成都做网站与策划设计,扎鲁特旗网站建设哪家好?创新互联公司做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:扎鲁特旗等地区。扎鲁特旗做网站价格咨询:18980820575这篇文章主要讲解了Android自定义圆弧进度条加数字动态变化的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
效果如下:
思路:一个内环圆弧和一个外环圆弧,因为有一个圆圈是在圆弧上做圆周运动,所以在画圆的时候必须要得到圆弧上的各个点的坐标,这里其实就用到了PathMeasure这个类,可以帮我们拿到这些点,在画圆弧的时候也理所应当的要使用path,然后根据外界动态的传值进行重绘就能达到动态的效果
代码如下:
public class ProgressPathRainbow extends View { private Paint outPaint; private Paint innerPaint; private Paint mTextPaint; private Paint mRmbTextPaint; private int mBorderWidth = 40; private int mCircleRadius = 40; private int mCurrentProgress = 0; private int mMaxProgress = 0; private int startAngle = 180; private int sweepAngels = 180; private Paint mCirclePaint; private String rmb = "¥"; private String currentText = "0.0"; public void setCurrentText(String currentText) { this.currentText = currentText; } //储存位置点 private float[] pos =new float[2]; public ProgressPathRainbow(Context context) { super(context); initPaint(); } public ProgressPathRainbow(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initPaint(); } public ProgressPathRainbow(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); } private void initPaint(){ outPaint = new Paint(); outPaint.setColor(0xFFECECEC); outPaint.setAntiAlias(true); outPaint.setStyle(Paint.Style.STROKE); outPaint.setStrokeCap(Paint.Cap.ROUND); outPaint.setStrokeWidth(mBorderWidth); // innerPaint = new Paint(); innerPaint.setColor(0xffFBA123); innerPaint.setAntiAlias(true); innerPaint.setStyle(Paint.Style.STROKE); innerPaint.setStrokeCap(Paint.Cap.ROUND); innerPaint.setStrokeWidth(mBorderWidth); mCirclePaint = new Paint(); mCirclePaint.setColor(Color.WHITE); mCirclePaint.setStyle(Paint.Style.FILL); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setColor(0xffE5423D); mTextPaint.setFakeBoldText(true); mTextPaint.setTextSize(SizeUtils.sp2px(42)); mRmbTextPaint = new Paint(); mRmbTextPaint.setAntiAlias(true); mRmbTextPaint.setColor(0xffE5423D); mRmbTextPaint.setTextSize(SizeUtils.sp2px(18)); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); if (width >= height){ setMeasuredDimension(height,height); }else { setMeasuredDimension(width,width); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); RectF rectF = new RectF(mBorderWidth,mBorderWidth,getWidth()-mBorderWidth,getHeight()-mBorderWidth); //画内环圆弧 Path outerPath = new Path(); outerPath.arcTo(rectF,startAngle,sweepAngels); canvas.drawPath(outerPath,outPaint); //画外环圆弧 Path innerPah = new Path(); float percent = (float)mCurrentProgress/mMaxProgress; innerPah.arcTo(rectF,startAngle,percent*sweepAngels); canvas.drawPath(innerPah,innerPaint); //画金额 String tempText = new BigDecimal(currentText).multiply(new BigDecimal(percent)).setScale(1, RoundingMode.HALF_UP).toString(); Rect textBounds = new Rect(); mTextPaint.getTextBounds(tempText, 0, tempText.length(), textBounds); int dx = getWidth()/2 - textBounds.width()/2; // 基线 baseLine Paint.FontMetricsInt fontMetrics = mTextPaint.getFontMetricsInt(); int dy = (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom; int baseLine = getHeight()/3 + dy; canvas.drawText(tempText,dx,baseLine,mTextPaint); //画人民币符号 Rect textBoundRmbs = new Rect(); mTextPaint.getTextBounds(rmb, 0, rmb.length(), textBoundRmbs); int dxRmb = dx-50; // 基线 baseLine Paint.FontMetricsInt fontMetricsRmb = mTextPaint.getFontMetricsInt(); int dyRmb = (fontMetricsRmb.bottom - fontMetricsRmb.top)/2 - fontMetricsRmb.bottom; int baseLineRmb = getHeight()/3 + dyRmb; canvas.drawText(rmb,dxRmb,baseLineRmb,mRmbTextPaint); //获取圆弧上点的位置(坐标,画一个圆) PathMeasure pathMeasure = new PathMeasure(outerPath,false); boolean posTan = pathMeasure.getPosTan(pathMeasure.getLength() * percent, pos, null); canvas.drawCircle(pos[0],pos[1],mCircleRadius,mCirclePaint); } public synchronized void setmCurrentProgress(int mCurrentProgress) { this.mCurrentProgress = mCurrentProgress; invalidate(); } public synchronized void setmMaxProgress(int mMaxProgress) { this.mMaxProgress = mMaxProgress; } }