1. 程式人生 > >android:漸變色進度條(圓環)

android:漸變色進度條(圓環)

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++;
        }
    };
}