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

相关推荐
梁同学与Android几秒前
Android ---【内存优化】常见的内存泄露以及解决方案
android·java·内存泄漏
人生游戏牛马NPC1号4 小时前
学习 Flutter (三):玩安卓项目实战 - 上
android·学习·flutter
小馬佩德罗5 小时前
Android系统的问题分析笔记 - Android上的调试方式 debuggerd
android·调试
清霜之辰6 小时前
安卓基于 FirebaseAuth 实现 google 登录
android·google·auth·firebase
GitLqr7 小时前
数码洞察 | Apple VS DMA、三星新品、Android 16KB Page Size
android·ios·samsung
alexhilton7 小时前
SnapshotFlow还是collectAsState?对于Jetpack Compose来说哪个更香?
android·kotlin·android jetpack
Erwooow8 小时前
Android 16k jni修改
android
l软件定制开发工作室8 小时前
基于Android的景点旅游信息系统App
android
张可8 小时前
一个KMP/CMP项目的组织结构和集成方式
android·前端·kotlin
林林要一直努力8 小时前
AOSP Settings模块问题初窥
android·学习·bug·android studio