import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
/**
* @author : isShuai
* @date : 2020/12/22
* 分数View
*/
public class MainScoreView extends View {
private float autoSize = 0;
private final int arcSize = 9;
private final int arcWidth = 18;
private final float arcRadian = 17;
private Paint roundPaint, backPaint, textPaint, arcPaint;
private String color = "#fe7c7c";
private final String gray = "#dad5ce";
private String color2 = "#fed2d2";
private final float textSize = 40;
private RectF rectF;
private String score = "0";
private int level = 0;
private final int LEVEL_ONE = 1;
private final int LEVEL_TWO = 2;
private final int LEVEL_THREE = 3;
private final Rect textBounds = new Rect();
private float textCenter = 0;
public MainScoreView(Context context) {
this(context, null);
}
public MainScoreView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MainScoreView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initPaint();
}
private void initPaint() {
roundPaint = new Paint();
roundPaint.setColor(Color.parseColor(color));
roundPaint.setAntiAlias(true);
backPaint = new Paint();
backPaint.setColor(Color.parseColor(color2));
backPaint.setAntiAlias(true);
textPaint = new Paint();
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(textSize);
textPaint.setAntiAlias(true);
arcPaint = new Paint();
arcPaint.setColor(Color.parseColor(color));
arcPaint.setStyle(Paint.Style.STROKE);
arcPaint.setAntiAlias(true);
arcPaint.setStrokeWidth(arcWidth);
arcPaint.setStrokeCap(Paint.Cap.ROUND);
rectF = new RectF();
setScore(0);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int w;
int h;
if (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) {
w = (int) autoSize;
} else w = widthMeasureSpec;
if (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) {
h = (int) autoSize;
} else h = heightMeasureSpec;
setMeasuredDimension(w, h);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < arcSize; i++) {
if (level == LEVEL_ONE) {
if (i >= 3 && i <= 5) {
arcPaint.setColor(Color.parseColor(color));
} else {
arcPaint.setColor(Color.parseColor(gray));
}
} else if (level == LEVEL_TWO) {
if (i >= 2 && i <= 6) {
arcPaint.setColor(Color.parseColor(color));
} else {
arcPaint.setColor(Color.parseColor(gray));
}
} else if (level == LEVEL_THREE) {
arcPaint.setColor(Color.parseColor(color));
}
float margin = i * ((arcRadian / 5) * 4);
if (i == 0) {
canvas.drawArc(rectF, 147 + i * arcRadian + margin, arcRadian / 2, false, arcPaint);
} else if (i == arcSize - 1)
canvas.drawArc(rectF, 147 + i * arcRadian + (margin - arcRadian / 2), arcRadian / 2, false, arcPaint);
else
canvas.drawArc(rectF, 147 + i * arcRadian + margin - arcRadian / 2, arcRadian, false, arcPaint);
}
canvas.drawCircle(((float) autoSize / 2), ((float) autoSize / 2), ((float) autoSize / 6 + 15), backPaint);
canvas.drawCircle(((float) autoSize / 2), ((float) autoSize / 2), ((float) autoSize / 6), roundPaint);
canvas.drawText(score, (float) autoSize / 2, ((float) autoSize / 2 - textCenter), textPaint);
}
public void setScore(int score) {
this.score = String.valueOf(score);
textPaint.getTextBounds(this.score, 0, this.score.length(), textBounds);
textCenter = (float) (textBounds.top + textBounds.bottom) / 2;
calcColor(score);
invalidate();
}
private void calcColor(int score) {
if (score > 0 && score <= 70) {
color = "#fe7c7c";
color2 = "#fed2d2";
level = LEVEL_ONE;
} else if (score > 70 && score <= 90) {
color = "#7a7cfe";
color2 = "#d8d6fe";
level = LEVEL_TWO;
} else if (score > 90) {
color = "#5486fc";
color2 = "#d4e2fe";
level = LEVEL_THREE;
}
arcPaint.setColor(Color.parseColor(color));
backPaint.setColor(Color.parseColor(color2));
roundPaint.setColor(Color.parseColor(color));
}
private void initArc() {
rectF.left = 0 + autoSize / 10;
rectF.top = 0 + autoSize / 10;
rectF.right = autoSize - autoSize / 10;
rectF.bottom = autoSize - autoSize / 10;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
int max = Math.max(w, h);
if (max == autoSize)
return;
autoSize = max;
initArc();
invalidate();
}
}
觉得有用的,点个赞再走吧~