Android 自定义进度条

来源:互联网 发布:mac开机进度条卡住 编辑:程序博客网 时间:2024/05/19 12:26

2.png

github:https://github.com/HarryXR/android

  • 水平进度条
    测量
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     int textHeight = ViewUtils.getTextHeight(mAlertTextPaint);    int height = 0;  if (!TextUtils.isEmpty(mLeftAlert) ||                   !TextUtils.isEmpty(mRightAlert))  {        height += textHeight;  //加上文字高度  }  height += LINE_MARGIN;    height += STROKE_WIDTH * 2;    height += LINE_MARGIN; if (!TextUtils.isEmpty(mLeftContent) || !TextUtils.isEmpty(mRightContent)) {        height += textHeight;    }    setMeasuredDimension(widthMeasureSpec, height);}

ViewUtils测量文本高度

public static int getTextHeight(Paint paint) {    Paint.FontMetrics fontMetrics = paint.getFontMetrics();   return (int) Math.ceil(fontMetrics.descent - fontMetrics.ascent);}

画进度

private void drawProgress(Canvas canvas) {    //画灰色进度    Paint bgPaint = getProgressPaint();     bgPaint.setColor(mProgressBg);    //左右扣除半个圆距离    canvas.drawLine(STROKE_WIDTH / 2, mHeight / 2, mWidth -       STROKE_WIDTH / 2, mHeight / 2, bgPaint);    //画绿色进度     Paint progressPaint = getProgressPaint();        progressPaint.setColor(mProgressColor);   int stopX = (int) ((mWidth - STROKE_WIDTH) * mProgress);    canvas.drawLine(STROKE_WIDTH / 2, mHeight / 2, stopX, mHeight / 2, progressPaint);    //画指示      Paint textPaint = getIndicatorPaint();    int textWidth = ViewUtils.getTextWidth(textPaint, mAlert);   Paint indicatorPaint = getProgressPaint();    indicatorPaint.setColor(mIndicatorBg);    indicatorPaint.setStrokeWidth(ALERT_STROKE_WIDTH);    canvas.drawLine(stopX - textWidth / 2, mHeight / 2, stopX + textWidth / 2, mHeight / 2, indicatorPaint);    //画指示文字    Paint.FontMetrics fm = textPaint.getFontMetrics();  int alertY = mHeight / 2 + (int) (Math.abs(fm.bottom + fm.top)) / 2;     canvas.drawText(mAlert, stopX - textWidth / 2, alertY, textPaint);}
  • 圆环
    大家看源码吧,涉及到一些数学公式的计算,原理类似
0 0
原创粉丝点击