注:前提已设置背景进度条,即把画笔Style设置为 Paint.Style.STROKE,绘制边框,套用方法一代码。
参数含义:
bgRectf :圆角长方形所需Rectf
getPaddingLeft:view与左边界之间的间距
getPaddingRight:view与右边界之间的间距
mTotalWidth:getMeasureWidth-getPaddingLeft-getPaddingRight 即view的宽度-左边界-右边界 进度条长度
progressHeight:进度条高度
radius: x方向、y方向圆角半径
第一种方法:根据progress值,计算X值,绘制圆角矩形,设置paint样式为Paint.Style.Fill,填充矩形
private void drawLoadingRect(Canvas canvas){
pgPaint.setColor(progressColor);
bgRectf = new RectF();
bgRectf.left = getPaddingLeft();
bgRectf.right = mTotalWidth*(progress/100f)+getPaddingLeft();
bgRectf.top = getPaddingTop();
bgRectf.bottom = bgRectf.top + progressHeight;
canvas.drawRoundRect(bgRectf, radius, radius, pgPaint);
}
第二种方法:
1.先绘制一个progress=100时的圆角矩形即:
bgRectf = new RectF(getPaddingLeft, getPaddingTop, getMeasuredWidth() - getPaddingRight, getPaddingTop);
2、clipRect()裁剪画布,设置画布的显示区域。只显示裁剪区域,未裁减区域不显示。
private void drawProgress(Canvas canvas) {
pgPaint.setColor(progressColor);
float right = (progress / maxProgress) * mTotalWidth+getPaddingLeft;
pgCanvas.save(Canvas.CLIP_SAVE_FLAG);
pgCanvas.clipRect(0, 0, right, getPaddingTop);
pgCanvas.drawColor(progressColor);
pgCanvas.restore();
if(!isStop){
pgPaint.setXfermode(xfermode);
pgCanvas.drawBitmap(flikerBitmap, flickerLeft, 0, pgPaint);
pgPaint.setXfermode(null);
}
//控制显示区域
bitmapShader = new BitmapShader(pgBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
pgPaint.setShader(bitmapShader);
canvas.drawRoundRect(bgRectf, radius, radius, pgPaint);
}
注:view重新设置参数后,view没变化,需要调用invalidate(),重新刷新view。