android:漸變色進度條(圓環)
阿新 • • 發佈:2018-11-06
public class CircleView extends View { private Paint paint;//畫筆 private Paint textPaint;//文言畫筆 private RectF oval;//rectF物件(圓環) private int currentDegree = 90;//當前度數(除360求百分比) @SuppressLint("RestrictedApi") private ArgbEvaluator argbEvaluator = new ArgbEvaluator();//顏色漸變差值器 private int height;//控制元件高 private int width;//控制元件寬 private int circleWidth;//圓環寬 private final static int strokeWidth = 4;//畫筆大小 private boolean isGradual = true;//是否顯示漸變色 private final int GREEN = 0xff00c882; private final int BLUE = 0xff229fff; public CircleView(Context context) { super(context); //初始化畫筆 paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.RED); oval = new RectF(); paint.setStrokeWidth(strokeWidth);//線寬 paint.setStyle(Paint.Style.STROKE); textPaint = new Paint(); textPaint.setColor(Color.WHITE); textPaint.setAntiAlias(true); textPaint.setStyle(Paint.Style.FILL); textPaint.setTextSize(20); textPaint.setTextAlign(Paint.Align.CENTER); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //計算最小寬度 height = View.MeasureSpec.getSize(heightMeasureSpec); width = View.MeasureSpec.getSize(widthMeasureSpec); if (width >= height) { circleWidth = height; } else { circleWidth = width; } setMeasuredDimension(circleWidth, circleWidth); oval.left = strokeWidth / 2; // 左邊 oval.top = strokeWidth / 2; // 上邊 oval.right = circleWidth - strokeWidth / 2; // 右邊 oval.bottom = circleWidth - strokeWidth / 2; // 下邊 //自動旋轉 // handler.postDelayed(runnable, 500); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < currentDegree; i++) { if (isGradual) { @SuppressLint("RestrictedApi") Integer color; if (i < 180) { color = (Integer) argbEvaluator.evaluate(i / 360f, GREEN, BLUE);//顏色插值器(level 11以上才可以用) } else { color = (Integer) argbEvaluator.evaluate(i / 360f, BLUE, GREEN); } paint.setColor(color); } else { if (i < 180) { paint.setColor(Color.BLUE);//右半邊顏色 } else { paint.setColor(Color.GREEN);//所半邊顏色 } } canvas.drawArc(oval, -90 + i, 1.35f, false, paint); // 繪製圓弧 1.35f是每個色塊寬度 // 色塊顯示 // if (i % 2 == 0) { // canvas.drawArc(oval, -90 + i, 1.35f, false, paint); // 繪製圓弧 1.35f是每個色塊寬度 // } } String text = (int) ((float) currentDegree / 360 * 100) + "%"; float textLength = textPaint.measureText(text); int centre = getWidth() / 2; canvas.drawText(text, centre, centre + textPaint.getTextSize() / 2, textPaint); } /** * 根據百分比設定顏色範圍 * * @param pDegree */ public void setCurrentDegree(float pDegree) { this.currentDegree = (int) (360f * pDegree); } /** * 顏色是否漸變 * * @param gradual */ public void setGradual(boolean gradual) { this.isGradual = gradual; } Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { if (currentDegree > 360) currentDegree = 0; invalidate(); handler.postDelayed(runnable, 500); currentDegree++; } }; }