Android 自定义进度条

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);}
  • 圆环
    大家看源码吧,涉及到一些数学公式的计算,原理类似

推荐阅读更多精彩内容