代码
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" />