package com.lqr.wechat.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View; /** * 环形的进度条 * * @author lwz <lwz0316@gmail.com> */ public class CircularProgressBar extends View { private int mDuration = 100; private int mProgress = 30; private Paint mPaint = new Paint(); private RectF mRectF = new RectF(); private int mBackgroundColor = Color.LTGRAY; private int mPrimaryColor = Color.parseColor("#6DCAEC"); private float mStrokeWidth = 10F; /** * 进度条改变监听 * * {@link #onChange( int duration, int progress, float rate)} */ public interface OnProgressChangeListener { /** * 进度改变事件,当进度条进度改变,就会调用该方法 * @param duration 总进度 * @param progress 当前进度 * @param rate 当前进度与总进度的商 即:rate = (float)progress / duration */ public void onChange(int duration, int progress, float rate); } private OnProgressChangeListener mOnChangeListener; /** * 设置进度条改变监听 * @param l */ public void setOnProgressChangeListener(OnProgressChangeListener l) { mOnChangeListener = l; } public CircularProgressBar(Context context) { super(context); } public CircularProgressBar(Context context, AttributeSet attrs) { super(context, attrs); } /** * 设置进度条的最大值, 该值要 大于 0 * @param max */ public void setMax( int max ) { if( max < 0 ) { max = 0; } mDuration = max; } /** * 得到进度条的最大值 * @return */ public int getMax() { return mDuration; } /** * 设置进度条的当前的值 * @param progress */ public void setProgress( int progress ) { if( progress > mDuration ) { progress = mDuration; } mProgress = progress; if( mOnChangeListener != null ) { mOnChangeListener.onChange(mDuration, progress, getRateOfProgress()); } invalidate(); } /** * 得到进度条当前的值 * @return */ public int getProgress() { return mProgress; } /** * 设置进度条背景的颜色 */ public void setBackgroundColor( int color ) { mBackgroundColor = color; } /** * 设置进度条进度的颜色 */ public void setPrimaryColor( int color ) { mPrimaryColor = color; } /** * 设置环形的宽度 * @param width */ public void setCircleWidth(float width) { mStrokeWidth = width; } @Override protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); int halfWidth = getWidth() / 2; int halfHeight = getHeight() /2; int radius = halfWidth < halfHeight ? halfWidth : halfHeight; float halfStrokeWidth = mStrokeWidth / 2; // 设置画笔 mPaint.setColor(mBackgroundColor); mPaint.setDither(true); mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); mPaint.setAntiAlias(true); mPaint.setStrokeWidth(mStrokeWidth); mPaint.setStyle(Paint.Style.STROKE); //设置图形为空心 // 画背景 canvas.drawCircle(halfWidth, halfHeight, radius - halfStrokeWidth, mPaint); // 画当前进度的圆环 mPaint.setColor(mPrimaryColor); // 改变画笔颜色 mRectF.top = halfHeight - radius + halfStrokeWidth; mRectF.bottom = halfHeight + radius - halfStrokeWidth; mRectF.left = halfWidth - radius + halfStrokeWidth; mRectF.right = halfWidth + radius - halfStrokeWidth; canvas.drawArc(mRectF, -90, getRateOfProgress() * 360, false, mPaint); canvas.save(); } /** * 得到当前的进度的比率 * <p> 用进度条当前的值 与 进度条的最大值求商 </p> * @return */ private float getRateOfProgress() { return (float)mProgress / mDuration; } }