package com.lfk.justwetools.View.LineProgress; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; /** * 条形进度条 * * @author liufengkai * Created by liufengkai on 15/11/6. */ public class LineProgress extends View { // 绘制初始线条 private Paint mLinePaint; // 绘制进度条 private Paint mProgressPiant; // 绘制进度条文字 private Paint mTextPaint; // 线条粗细 private int lineWidth = 10; // 进度条粗细 private int progressWidth = lineWidth + 2; // 文字尺寸 private int textSize = 20; // 线条颜色 private int lineColor = Color.GRAY; // 进度条颜色 private int progressColor = Color.BLACK; // 文字颜色 private int textColor = progressColor; // 左右边距 private int padding = 8; // 与文字的边距 private int paddingWithText = 10; // 百分比! private float progressing = 0; // MAX百分比 private int maxProgressing = 100; private Context context; public LineProgress(Context context) { super(context); this.context = context; initView(); } public LineProgress(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; initView(); } private void initView() { mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mLinePaint.setColor(lineColor); mLinePaint.setStyle(Paint.Style.STROKE); mLinePaint.setAntiAlias(true); mLinePaint.setDither(true); mLinePaint.setStrokeWidth(lineWidth); mProgressPiant = new Paint(Paint.ANTI_ALIAS_FLAG); mProgressPiant.setColor(progressColor); mProgressPiant.setStyle(Paint.Style.STROKE); mProgressPiant.setAntiAlias(true); mProgressPiant.setDither(true); mProgressPiant.setStrokeWidth(progressWidth); mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mTextPaint.setColor(textColor); mTextPaint.setTextSize(textSize); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); } private int measureHeight(int heightMeasureSpec) { int result = getHeight(); int specMode = MeasureSpec.getMode(heightMeasureSpec); int specSize = MeasureSpec.getSize(heightMeasureSpec); if (specMode == MeasureSpec.AT_MOST || specMode == MeasureSpec.EXACTLY) { result = specSize; } return result; } private int measureWidth(int widthMeasureSpec) { int result = getWidth(); int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); if (specMode == MeasureSpec.AT_MOST || specMode == MeasureSpec.EXACTLY) { result = specSize; } return result; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); // 转换位置 canvas.translate(getPaddingLeft(), getHeight() / 2); if (progressing >= maxProgressing) { progressing = maxProgressing; } float size = ((progressing * 1.0f / maxProgressing) * (getWidth() - 2 * padding)) + padding + paddingWithText; String s = progressing + "%"; if (size > getWidth()) { size = getWidth() - s.length() * textSize / 2 - padding; } // 绘制灰色底线 canvas.drawLine(padding, 0, getWidth() - padding, 0, mLinePaint); // 绘制进度条 canvas.drawLine(padding, 0, (progressing * 1.0f / maxProgressing) * (getWidth() - 2 * padding) + padding, 0, mProgressPiant); // 绘制文字 canvas.drawText(s, 0, s.length(), size, textSize + progressWidth, mTextPaint); } /** * 底线宽度 * * @param lineWidth */ public void setLineWidth(int lineWidth) { this.lineWidth = lineWidth; } /** * 进度条粗细 * * @param progressWidth */ public void setProgressWidth(int progressWidth) { this.progressWidth = progressWidth; } /** * 字体粗细 * * @param textSize */ public void setTextSize(int textSize) { this.textSize = textSize; } /** * 进度条颜色 * * @param progressColor */ public void setProgressColor(int progressColor) { this.progressColor = progressColor; } /** * 底线颜色 * * @param lineColor */ public void setLineColor(int lineColor) { this.lineColor = lineColor; } /** * 文字颜色 * * @param textColor */ public void setTextColor(int textColor) { this.textColor = textColor; } /** * 设定两端的内边距 * * @param padding */ public void setPadding(int padding) { this.padding = padding; } /** * 设定百分比 * * @param progressing */ public void setProgressing(float progressing) { this.progressing = progressing; invalidate(); } /** * 获取百分比 * * @return */ public float getProgressing() { return progressing; } /** * 设定最大百分比 * * @param maxProgressing */ public void setMaxProgressing(int maxProgressing) { this.maxProgressing = maxProgressing; } /** * 设定字与进度条的间距 * * @param paddingWithText */ public void setPaddingWithText(int paddingWithText) { this.paddingWithText = paddingWithText; } }