Android开发--ProgressBar应用显示测点数量

1.自定义ProgressBarView

java 复制代码
public class ProgressBarView extends View {
    private Paint mPaintBack;
    private Paint mPaint;
    private Paint mPaintText;
    private float process;
    int strokeWidth = 3;//圈宽度
    int textSize= 17;//字大小
    private long duration = 1000;
    private float startDegree = 0;
    private float endDegree = 360;
    private float total = 16; // 默认总数为16
    private int color = Color.GRAY; // 默认颜色为灰色
    private String name = "在线测点";
    private String number = "0";


    public ProgressBarView(Context context) {
        super(context);
        init();
    }

    public ProgressBarView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ProgressBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaintBack = new Paint();
        mPaintBack.setColor(Color.GRAY);
        mPaintBack.setStyle(Paint.Style.STROKE);
        mPaintBack.setAntiAlias(true);
        mPaintBack.setStrokeCap(Paint.Cap.ROUND);
        mPaintBack.setStrokeWidth(strokeWidth);

        mPaint = new Paint();
        mPaint.setColor(color);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(strokeWidth);

        mPaintText = new Paint();
        mPaintText.setAntiAlias(true);
        mPaintText.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaintText.setColor(color);
        mPaintText.setStrokeCap(Paint.Cap.ROUND);
        mPaintText.setTextSize(sp2px((int)textSize));
    }

    public void setStrokeWidth(int width) {
        strokeWidth = width;
    }

    public void setTextSize(int textSize) {
        this.textSize = textSize;
    }

    public void setDuration(long duration) {
        this.duration = duration;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 创建圆环矩形
        RectF rectF = new RectF(strokeWidth, strokeWidth, getWidth() - strokeWidth, getHeight() - strokeWidth);
        // 画出背景进度条
        canvas.drawArc(rectF, 0, 360, false, mPaintBack);
        // 画进度条
        canvas.drawArc(rectF, 0, process, false, mPaint);
        // 设置文字在canvas中的位置
        Paint.FontMetrics fm = mPaintText.getFontMetrics();
        int mTxtWidth = (int) mPaintText.measureText(number, 0, number.length());
        int mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);
        int x = getWidth() / 2 - mTxtWidth / 2;
        int y = getHeight() / 2;
        canvas.drawText(number, x, y, mPaintText);
        canvas.drawText(name, x-(int) (mPaintText.measureText(name, 0, name.length())/3), y + mTxtHeight, mPaintText);
    }

    /**
     * 设置传入总测点数
     */
    public void setTotal(float total) {
        this.total = total;
    }
    /**
     * 设置传入name
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * 设置传入颜色
     */
    public void setColor(int color) {
        this.color = color;
        mPaint.setColor(color);
        mPaintText.setColor(color);
    }

    /**
     * 设置传入测点数
     */
    public void setProgress(float progress) {
        float angle = (progress / total) * 360;
        startDegree = 0;
        endDegree = angle;
        // 更新number的值
        number = String.valueOf((int)progress);
        invalidate();
    }

    /**
     * 设置动画效果
     */
    public void start() {
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(startDegree, endDegree);
        valueAnimator.setDuration(duration);
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();
                process = (int)value;
                invalidate();
            }
        });
        valueAnimator.start();
    }

    private int sp2px(int sp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
                getResources().getDisplayMetrics());
    }
}

2.XML引用

XML 复制代码
<com.afison.newfault.view.ProgressBarView
     android:id="@+id/pb_ele"
     android:layout_width="108dp"
     android:layout_height="108dp"
     android:layout_marginEnd="@dimen/margin_big"
     android:layout_marginTop="@dimen/margin_medium"
     android:layout_marginBottom="@dimen/margin_medium">

</com.afison.newfault.view.ProgressBarView>

3.更新UI

java 复制代码
pbEle.setColor(getResources().getColor(R.color.pbBlue));
        pbEle.setName("电流测点");
        pbEle.setTotal(16);
        pbEle.setProgress(14);
        pbEle.start();

4.效果展示

相关推荐
CYRUS STUDIO1 小时前
ARM64汇编寻址、汇编指令、指令编码方式
android·汇编·arm开发·arm·arm64
weixin_449310842 小时前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
Zender Han2 小时前
Flutter自定义矩形进度条实现详解
android·flutter·ios
白乐天_n4 小时前
adb:Android调试桥
android·adb
姑苏风8 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
数据猎手小k11 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小1012 小时前
JavaWeb项目-----博客系统
android
风和先行12 小时前
adb 命令查看设备存储占用情况
android·adb
AaVictory.13 小时前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
似霰14 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder