Android 自定义进度条
16lz
2021-01-23
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);}
- 圆环
大家看源码吧,涉及到一些数学公式的计算,原理类似
更多相关文章
- 安卓开发---进度条
- android实现进度条ProgressDialog
- 【Demo实例】Android FTP上传带进度条(优化后代码)
- android圆形进度条ProgressBar颜色设置
- android中自定义进度条风格
- android之实现ProgressBar进度条组件
- 进度条与拖动条的使用学习
- Android魔术——手把手教你实现水晶球波浪进度条
- android 里面的测量单位