package cn.androidy.thinking.views; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import android.widget.ProgressBar; /** * 扇形进度条 * Created by Rick Meng on 2015/7/11. */ public class SectorProgressBar extends View { /** * 圆的直径 */ private int mRadius; /** * 圆的中心位置 */ private int mCenter; /** * 绘制进度提示文本 */ private Paint mTextPaint; /** * 绘制扇形区域的画笔 */ private Paint mArcPaint; /** * 整个扇形所在的圆的矩形范围 */ private RectF mRange = null; private int mMax = 100; private int mProgress; private SectorStyle sectorStyle = SectorStyle.WEDGE; private int defaultColor = 0xff000000; private int progressColor = 0xff4CAF50; private DisplayMetrics dm; private Rect mTextBound = new Rect(); public static enum SectorStyle { WEDGE,//楔形 RING//圆环 } public SectorProgressBar(Context context) { this(context, null); } public SectorProgressBar(Context context, AttributeSet attrs) { super(context, attrs); // 初始化绘制圆弧的画笔 mArcPaint = new Paint(); mArcPaint.setAntiAlias(true); mArcPaint.setDither(true); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setDither(true); mTextPaint.setColor(progressColor); mTextPaint.setTextSize(TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics())); dm = getResources().getDisplayMetrics(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = Math.min(getMeasuredWidth(), getMeasuredHeight()); // 获取圆形的直径 mRadius = width - getPaddingLeft() - getPaddingRight(); // 中心点 mCenter = width / 2; setMeasuredDimension(width, width); if (mRange == null) { // 圆弧的绘制范围 mRange = new RectF(getPaddingLeft(), getPaddingLeft(), mRadius + getPaddingLeft(), mRadius + getPaddingLeft()); } } @Override protected void onDraw(Canvas canvas) { if (sectorStyle == SectorStyle.WEDGE) { mArcPaint.setColor(progressColor); mArcPaint.setStyle(Paint.Style.FILL); // 设置空心 float endEdge = 360 * mProgress * 1.0f / mMax; canvas.drawArc(mRange, -90, endEdge, true, mArcPaint); } else if (sectorStyle == SectorStyle.RING) { mArcPaint.setColor(defaultColor); // 设置圆环的颜色 mArcPaint.setStrokeWidth(3 * dm.density); // 设置圆环的宽度 mArcPaint.setStyle(Paint.Style.STROKE); // 设置空心 canvas.drawCircle(mCenter, mCenter, mRadius / 2, mArcPaint); // 画出圆环 mArcPaint.setColor(progressColor); float endEdge = 360 * mProgress * 1.0f / mMax; canvas.drawArc(mRange, -90, endEdge, false, mArcPaint); // 根据进度画圆弧 String text = mProgress / (mMax / 100) + "%"; float w = measureText(text.toString(), mTextPaint);//必须先测量让mTextBound获取值。 int startX = (int) (mCenter - w / 2);//文字居中 Paint.FontMetricsInt fmi = mTextPaint.getFontMetricsInt(); float baseline = (float) (mCenter + (fmi.bottom / 2 + fmi.top / 2)); canvas.drawText(text, startX, baseline, mTextPaint); } } private float measureText(String text, Paint paint) { float w = paint.measureText(text); mTextBound = new Rect(); paint.getTextBounds(text, 0, text.length(), mTextBound); return w; } public synchronized void setProgress(int progress) { mProgress = progress; postInvalidate(); } public void setMax(int max) { mMax = max; } public void setSectorStyle(SectorStyle sectorStyle) { this.sectorStyle = sectorStyle; } public SectorStyle getSectorStyle() { return sectorStyle; } }