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

相关推荐
三少爷的鞋1 小时前
换个思路理解:非阻塞挂起
android
好的佩奇2 小时前
蓝牙之经典蓝牙
android·flutter·蓝牙
传奇开心果编程4 小时前
【Flutter踩坑排雷】第19课:路由硬编码坑|字符串路由书写错误,页面跳转失败排查
android·flutter·ios·移动开发·跨平台·ui框架·声明式ui
微小的鱼7 小时前
Linux的渲染与显示系统链路
android·java·linux
道尔柯南19 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
唐诺20 小时前
5、Android JNI 动态注册中的“签名“详解
android·jni
zhaoshuzhaoshu1 天前
Android 系统启动与调试中的日志抓取方式全解析
android
雨声不在1 天前
android 动画掉帧
android
在多学一点1 天前
MYSQL第二次作业
android·数据库·mysql
骑着蜗牛撵大象3271 天前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
android·数据库·sql·mysql·优化器·执行计划