1. 程式人生 > >【Android Util】CircleProgressView 圓形進度條

【Android Util】CircleProgressView 圓形進度條

package smxy.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
/**
 * @author smxy
 * @name CircleProgressView
* @description * @date 2017/10/11 */ public class CircleProgressView extends View { private static final String TAG = "CircleProgressView"; private int mMaxProgress = 100; private int mProgress = 0; private final int mCircleLineStrokeWidth = 8; private final int mCirclePointStrokeWidth
= 10; private final int mTxtStrokeWidth = 2; // 畫圓所在的距形區域 private final RectF mRectF; private final Paint mPaint; private final Context mContext; private String mTxtHint1; private String mTxtHint2; private int bgColor = 0xdfdfdf; private int processColor = 0x3399ff; private int
strockColor = 0xe9e9e9; private float angle; private int mRadius; public CircleProgressView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mRectF = new RectF(); mPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = this.getWidth(); int height = this.getHeight(); if (width != height) { int min = Math.min(width, height); width = min; height = min; } // 設定畫筆相關屬性 mPaint.setAntiAlias(true); mPaint.setColor(Color.rgb(0xe9,0xe9,0xe9)); canvas.drawColor(Color.TRANSPARENT); mPaint.setStrokeWidth(mCircleLineStrokeWidth); mPaint.setStyle(Paint.Style.STROKE); // 位置 mRectF.left = mCircleLineStrokeWidth / 2 + (mCirclePointStrokeWidth - mCircleLineStrokeWidth/2); // 左上角x mRectF.top = mCircleLineStrokeWidth / 2 + (mCirclePointStrokeWidth - mCircleLineStrokeWidth/2); // 左上角y mRectF.right = width - mCircleLineStrokeWidth / 2 - (mCirclePointStrokeWidth - mCircleLineStrokeWidth/2); // 左下角x mRectF.bottom = height - mCircleLineStrokeWidth / 2 - (mCirclePointStrokeWidth - mCircleLineStrokeWidth/2); // 右下角y // 繪製圓圈,進度條背景 canvas.drawArc(mRectF, 0, 360, false, mPaint); mPaint.setColor(Color.rgb(0x33,0x99,0xff)); angle = ((float)mProgress / mMaxProgress) * 360; canvas.drawArc(mRectF, -90, angle, false, mPaint); //在圓圈處畫個小圓圈 mRadius = width/2 - mCirclePointStrokeWidth; mPaint.setStyle(Paint.Style.FILL); canvas.drawCircle( (float) (width/2 + (mRadius * Math.cos((angle - 90)*Math.PI/180))), (float) (height/2 + (mRadius * Math.sin((angle - 90)*Math.PI/180))), mCirclePointStrokeWidth,mPaint); // 繪製進度文案顯示 mPaint.setStrokeWidth(mTxtStrokeWidth); String text = mProgress + ""; int textHeight = height / 4; mPaint.setTextSize(textHeight); mPaint.setColor(Color.rgb(0x66,0x66,0x66)); int textWidth = (int) mPaint.measureText(text, 0, text.length()); mPaint.setStyle(Paint.Style.FILL); canvas.drawText(text, width / 2 - textWidth / 2, height / 2 + textHeight / 2, mPaint); if (!TextUtils.isEmpty(mTxtHint1)) { mPaint.setStrokeWidth(mTxtStrokeWidth); text = mTxtHint1; textHeight = height / 8; mPaint.setTextSize(textHeight); mPaint.setColor(Color.rgb(0x33,0x99,0xff)); textWidth = (int) mPaint.measureText(text, 0, text.length()); mPaint.setStyle(Paint.Style.FILL); canvas.drawText(text, width / 2 - textWidth / 2, height / 4 + textHeight / 2, mPaint); } if (!TextUtils.isEmpty(mTxtHint2)) { mPaint.setStrokeWidth(mTxtStrokeWidth); text = mTxtHint2; textHeight = height / 8; mPaint.setTextSize(textHeight); textWidth = (int) mPaint.measureText(text, 0, text.length()); mPaint.setStyle(Paint.Style.FILL); canvas.drawText(text, width / 2 - textWidth / 2, 3 * height / 4 + textHeight / 2, mPaint); } } public int getMaxProgress() { return mMaxProgress; } public void setMaxProgress(int maxProgress) { this.mMaxProgress = maxProgress; } public void setProgress(int progress) { this.mProgress = progress; this.invalidate(); } public void setProgressNotInUiThread(int progress) { this.mProgress = progress; this.postInvalidate(); } public String getmTxtHint1() { return mTxtHint1; } public void setmTxtHint1(String mTxtHint1) { this.mTxtHint1 = mTxtHint1; } public String getmTxtHint2() { return mTxtHint2; } public void setmTxtHint2(String mTxtHint2) { this.mTxtHint2 = mTxtHint2; } }