c语言编程笔录

首页 >   > 笔记大全

笔记大全

Android实现自定义圆形进度条的常用方法有哪些

更新时间:2023-10-02

1. 使用Canvas绘制圆形进度条

使用Android中提供的Canvas类,可以很方便的绘制圆形进度条。Canvas类是对原生的绘图API的封装,可以进行各种形状的绘制。

public class CircleProgressBar extends View {
    /**
     * 最大进度
     */
    private int maxProgress = 100;
    /**
     * 当前进度
     */
    private int currentProgress = 0;
    private int progressColor;
    private int backgroundColor;

    public CircleProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar);
        progressColor = a.getColor(R.styleable.CircleProgressBar_progressColor, Color.RED);
        backgroundColor = a.getColor(R.styleable.CircleProgressBar_backgroundColor, Color.GRAY);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int centerX = getWidth() / 2;
        int centerY = getHeight() / 2;
        int radius = getWidth() / 2 - 10;
        Paint paint = new Paint();
        paint.setColor(backgroundColor);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(20);
        canvas.drawCircle(centerX, centerY, radius, paint);

        paint.setColor(progressColor);
        paint.setStrokeWidth(20);
        float progress = (float) currentProgress / maxProgress;
        canvas.drawArc(new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius), -90, progress * 360, false, paint);
    }

    /**
     * 设置最大进度
     */
    public void setMaxProgress(int maxProgress) {
        this.maxProgress = maxProgress;
    }

    /**
     * 设置当前进度
     */
    public void setCurrentProgress(int currentProgress) {
        this.currentProgress = currentProgress;
        invalidate();
    }
}

2. 使用ProgressBar实现圆形进度条

Android系统中提供了ProgressBar组件,可以实现各种形式的进度条。通过修改ProgressBar的样式,可以实现圆形进度条。

public class CircleProgressBar extends ProgressBar {

    public CircleProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected synchronized void onDraw(Canvas canvas) {
        // 圆心坐标
        int centerX = getWidth() / 2;
        int centerY = getHeight() / 2;
        // 半径
        int radius = getWidth() / 2 - 10;
        // 进度条颜色和背景色
        int progressColor = Color.RED;
        int backgroundColor = Color.GRAY;
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(20);
        paint.setColor(backgroundColor);
        // 绘制背景圆
        canvas.drawCircle(centerX, centerY, radius, paint);
        paint.setColor(progressColor);
        // 计算进度条结束时的角度
        float sweepAngle = getProgress() * 1.0f / getMax() * 360;
        // 绘制进度条
        canvas.drawArc(new RectF(centerX - radius, centerY - radius, centerX + radius, centerY + radius), -90, sweepAngle, false, paint);
    }
}

3. 第三方开源库:CircleProgress

CircleProgress是一款开源的圆形进度条库,可以在Github上找到其源代码。

dependencies {
    implementation 'com.github.lzyzsd:circleprogress:1.2.1'
}

4. 第三方开源库:SmoothProgressBar

SmoothProgressBar是另一款比较流行的开源圆形进度条库,同样可以在Github上找到其源代码。

dependencies {
    implementation 'com.github.castorflex.smoothprogressbar:library:1.2.0'
}


总结

以上就是几种常用的Android实现自定义圆形进度条的方法。使用Canvas绘制圆形进度条是最基础的方法,需要手写代码绘制各种形状。使用ProgressBar可以减少很多工作量,但样式比较单一。第三方开源库可以帮助实现更加美观的圆形进度条,可以根据项目需要选择不同的库。