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