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.效果展示

相关推荐
summerkissyou19875 小时前
Android - 摄像头 - hal - 开发教程,例子,常见问题,分析方法,解决方案
android
summerkissyou19876 小时前
Android 16 架构图
android
神龙天舞20017 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
码农coding10 小时前
android12 systemUI 之锁屏
android
圆山猫10 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
爱笑鱼10 小时前
Binder(七):getCallingUid() 读到的是谁?clearCallingIdentity() 又清掉了什么?
android
2501_9159090616 小时前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
Lvan的前端笔记16 小时前
AndroidX 完全入门指南
android·androidx
帅次17 小时前
Android 应用高级面试:Window 近1年高频追问 18 题
android·面试·职场和发展
总捣什么乱117 小时前
MySQL MySQL是怎么保证主备一致的?
android·mysql·adb