渐变进度条?绘制两个圆角矩形不就完事了?
特殊情况 1. 进度过小 矩形的宽度小于高度 绘制的圆角就是一个竖着的长条 无法达到想要的效果。
解决方案 : 使用Path绘制求交集
当宽度小于高度时 绘制的进度条左移
可自行抽取自定义属性 这里只记录一个简单实现
public class LinearProgressView extends View {
private int mStartColor;//渐变开始颜色
private int mEndColor;//渐变结束颜色
private float mProgress = 100;//进度条总进度
private int mbgColor;//背景边框颜色
private float mCurrentProgress;//当前进度
private int mRadius;
private Paint mPaint;
private LinearGradient gradient;
private Path path;
private Path pathBg;
private Path pathPro;
private RectF rectF;
public LinearProgressView(Context context) {
super(context, null);
}
public LinearProgressView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs, 0);
mStartColor = SystemUtil.getColor(R.color.linear_pro_start_color);
mEndColor = SystemUtil.getColor(R.color.linear_pro_end_color);
mbgColor = SystemUtil.getColor(R.color.linear_pro_bg_bolder_color);
mRadius = SystemUtil.dp2px(10);
init();
}
public LinearProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mStartColor = SystemUtil.getColor(R.color.linear_pro_start_color);
mEndColor = SystemUtil.getColor(R.color.linear_pro_end_color);
mbgColor = SystemUtil.getColor(R.color.linear_pro_bg_bolder_color);
mRadius = SystemUtil.dp2px(10);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setAntiAlias(true);
path = new Path();
pathBg = new Path();
pathPro = new Path();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void setCurrentProgressValue(float currentProgressValue, float allValue) {
mCurrentProgress = currentProgressValue;
mProgress = allValue;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (rectF == null) {
rectF = new RectF();
}
//绘制背景
mPaint.setColor(mbgColor);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(SystemUtil.dp2px(1));
rectF.left = 0;
rectF.bottom = getHeight();
rectF.right = getWidth();
rectF.top = 0;
pathBg.addRoundRect(rectF, mRadius, mRadius, Path.Direction.CW);
canvas.drawPath(pathBg, mPaint);
//绘制进度条
if (gradient == null) {
gradient = new LinearGradient(0, getHeight() / 2, getWidth(), getHeight() / 2,
mStartColor, mEndColor , Shader.TileMode.MIRROR);
}
mPaint.setShader(gradient);
mPaint.setStyle(Paint.Style.FILL);
float progressValue = 0;
if (mProgress != 0) {
progressValue = mCurrentProgress / mProgress * getWidth();
}
if (progressValue>getWidth()){
progressValue = getWidth();
}
rectF.bottom = getHeight();
rectF.left = progressValue < getHeight() ? progressValue - getHeight() : 0;
rectF.right = progressValue;
rectF.top = 0;
pathPro.addRoundRect(rectF, mRadius, mRadius, Path.Direction.CW);
path.op(pathBg, pathPro, Path.Op.INTERSECT);
canvas.drawPath(path, mPaint);
path.reset();
pathBg.reset();
pathPro.reset();
mPaint.reset();
}
}