Android,自定义View,弧形分段分数View

765 阅读1分钟

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();
    }

}

觉得有用的,点个赞再走吧~