渐变进度条?绘制两个圆角矩形不就完事了?
特殊情况 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(); } }