自定义信用等级MyProgressBar

代码

package com.example.event;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * 说明:自定义信用等级
 */
public class MyProgressBar extends View {

    private Paint mCircleOutPaint;
    private Paint mLinePaint;

    private Paint mDefaltCircleOutPaint;
    private Paint mDefaltLinePaint;

    private Paint mTvPaint;
    private int circleOutRadius = 16;
    private int margin = 60; //左右margin

    private float mProgress;
    private ValueAnimator animation;

    public MyProgressBar(Context context) {
        super(context);
        initView();
    }

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

    public MyProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    public void initView() {
        mCircleOutPaint = new Paint();
        mCircleOutPaint.setStyle(Paint.Style.FILL);
        mCircleOutPaint.setColor(Color.WHITE);
        mCircleOutPaint.setAntiAlias(true);

        mLinePaint = new Paint();
        mLinePaint.setColor(Color.parseColor("#5F3622"));
        mLinePaint.setStrokeWidth(8);

        mDefaltCircleOutPaint = new Paint();
        mDefaltCircleOutPaint.setStyle(Paint.Style.FILL);
        mDefaltCircleOutPaint.setColor(Color.WHITE);
        mDefaltCircleOutPaint.setAntiAlias(true);

        mDefaltLinePaint = new Paint();
        mDefaltLinePaint.setColor(Color.WHITE);
        mDefaltLinePaint.setStrokeWidth(8);

        mTvPaint = new Paint();
        mTvPaint.setColor(Color.parseColor("#5F3622"));
        mTvPaint.setTextSize(sp2px(getContext(), 12));
        mTvPaint.setTextSkewX(-0.2f);
    }

    public void setProgress(float progress) {
        if (animation == null) {
            animation = ValueAnimator.ofFloat(0f, Float.valueOf(progress));
        }

        if (progress > 0 && progress <= 200) {
            mLinePaint.setColor(Color.parseColor("#5F3622"));
            mCircleOutPaint.setColor(Color.parseColor("#5F3622"));
        } else if (progress > 200 && progress <= 400) {
            mLinePaint.setColor(Color.parseColor("#5F3622"));
            mCircleOutPaint.setColor(Color.parseColor("#5F3622"));
        } else if (progress > 400 && progress <= 600) {
            mLinePaint.setColor(Color.parseColor("#5F3622"));
            mCircleOutPaint.setColor(Color.parseColor("#5F3622"));
        } else if (progress > 600 && progress <= 800) {
            mLinePaint.setColor(Color.parseColor("#5F3622"));
            mCircleOutPaint.setColor(Color.parseColor("#5F3622"));
        } else if (progress > 800) {
            mLinePaint.setColor(Color.parseColor("#5F3622"));
            mCircleOutPaint.setColor(Color.parseColor("#5F3622"));
        }

        animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mProgress = (float) animation.getAnimatedValue();
                invalidate();
            }
        });
        animation.setDuration(500);
        animation.start();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        getSuggestedMinimumWidth();
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int height = getHeight();
        int width = getWidth();
        int realWidth = (width - 2 * margin - 10 * circleOutRadius) / 4;

        canvas.drawLine(margin + circleOutRadius * 2, height / 2, width - margin - circleOutRadius * 2, height / 2, mDefaltLinePaint);

        for (int i = 0; i < 5; i++) {
            canvas.drawCircle(margin + circleOutRadius * (i * 2 + 1) + realWidth * i, height / 2, circleOutRadius, mDefaltCircleOutPaint);
        }


        canvas.drawText("V1", margin + circleOutRadius - getTextWidth("V1"), height / 2 + 50, mTvPaint);
        canvas.drawText("V2", margin + circleOutRadius * 2 + realWidth - getTextWidth("V2"), height / 2 + 50, mTvPaint);
        canvas.drawText("V3", margin + circleOutRadius * 4 + realWidth * 2 - getTextWidth("V3"), height / 2 + 50, mTvPaint);
        canvas.drawText("V4", margin + circleOutRadius * 6 + realWidth * 3 - getTextWidth("V4"), height / 2 + 50, mTvPaint);
        canvas.drawText("V5", margin + circleOutRadius * 8 + realWidth * 4 - getTextWidth("V5"), height / 2 + 50, mTvPaint);

        float ratio;
        float result = 0;
        if (mProgress > 0 && mProgress <= 200) {
            ratio = mProgress / 200;
            result = margin + circleOutRadius * 2 + (ratio * realWidth);
        } else if (mProgress > 200 && mProgress <= 400) {
            ratio = (mProgress - 200) / 200;
            result = margin + circleOutRadius * 4 + (ratio * realWidth) + realWidth;
        } else if (mProgress > 400 && mProgress <= 600) {
            ratio = (mProgress - 400) / 200;
            result = margin + circleOutRadius * 6 + realWidth * 2 + (ratio * realWidth);
        } else if (mProgress > 600 && mProgress <= 800) {
            ratio = (mProgress - 600) / 200;
            result = margin + circleOutRadius * 8 + realWidth * 3 + (ratio * realWidth);
        } else if (mProgress > 800) {
            result = margin + circleOutRadius * 10 + 4 * realWidth;
        }
        canvas.drawLine(margin + circleOutRadius, height / 2, result, height / 2, mLinePaint);

        if (mProgress <= 0) {
            return;
        }
        canvas.drawCircle(margin + circleOutRadius, height / 2, circleOutRadius, mCircleOutPaint);
        if (mProgress < 200) {
            return;
        }
        canvas.drawCircle(margin + circleOutRadius * 3 + realWidth, height / 2, circleOutRadius, mCircleOutPaint);
        if (mProgress < 400) {
            return;
        }
        canvas.drawCircle(margin + circleOutRadius * 5 + realWidth * 2, height / 2, circleOutRadius, mCircleOutPaint);
        if (mProgress < 600) {
            return;
        }
        canvas.drawCircle(margin + circleOutRadius * 7 + realWidth * 3, height / 2, circleOutRadius, mCircleOutPaint);
        if (mProgress < 800) {
            return;
        }
        canvas.drawCircle(margin + circleOutRadius * 9 + realWidth * 4, height / 2, circleOutRadius, mCircleOutPaint);
    }

    public float getTextWidth(String text) {
        return mTvPaint.measureText(text) / 2;
    }

    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }
}

应用

bar = (MyProgressBar) findViewById(R.id.bar);
        bar.setProgress(299);

布局文件

<com.example.event.MyProgressBar
        android:id="@+id/bar"
        android:layout_width="match_parent"
        android:layout_height="50dp" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值