Android 自定义ProgressBar进度条

1.设置:progressBar.setProgressDrawable();

java 复制代码
    /**
     * 圆形进度条
     * @return
     */
    private Drawable createCircleProgressDrawable() {
        // 2. 使用自定义 Drawable 实现圆环
        return new Drawable() {
            private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            // 1. 定义圆环厚度
            final float strokeWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());

            @Override
            public void draw(Canvas canvas) {
                Rect bounds = getBounds();
                float centerX = bounds.centerX();
                float centerY = bounds.centerY();
                // 计算半径,留出画笔粗细的一半防止被裁剪
                float radius = (Math.min(bounds.width(), bounds.height()) - strokeWidth) / 2;

                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(strokeWidth);

                // 【关键:设置圆角切口】
                paint.setStrokeCap(Paint.Cap.ROUND);

                // 1. 画背景圆环(浅灰色)
                paint.setColor(Color.parseColor("#33FFFFFF"));
                canvas.drawCircle(centerX, centerY, radius, paint);
                int level = getLevel();
                // 2. 画进度弧线
                if (level <= 2000) {//20%
                    paint.setColor(Color.parseColor("#FFD700"));//黄色
                } else {
                    paint.setColor(Color.parseColor("#4CAF50"));//绿色
                }
                // getLevel() 范围是 0-10000
                float sweepAngle = (level / 10000f) * 360f;

                RectF oval = new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius);
                // 从 270 度(12点钟方向)开始顺时针绘制
                canvas.drawArc(oval, 270, sweepAngle, false, paint);
            }

            @Override
            protected boolean onLevelChange(int level) {
                invalidateSelf(); // 当 ProgressBar 调用 setProgress 时,level 会变,触发重绘
                return true;
            }

            @Override
            public void setAlpha(int alpha) {
                paint.setAlpha(alpha);
            }

            @Override
            public void setColorFilter(ColorFilter colorFilter) {
                paint.setColorFilter(colorFilter);
            }

            @Override
            public int getOpacity() {
                return PixelFormat.TRANSLUCENT;
            }
        };
    }