公司产品逆变器,需要一个显示设备的功率图,如下图所示
那就开始自定义圆环了,如果是新手小白的话,建议重新学习下,Android 的自定义View,从基础开始学习,原来工作中很少接触到自定义View,所以自己重新学习了一下,里面的一些东西使用也不是很规范,下面废话少说,上代码,所有的代码都有注释,写的非常清楚
自定义的一些属性
<declare-styleable name="InverterHalfView">
<attr name="startText" format="integer" />
<attr name="endText" format="integer" />
<attr name="currentPower" format="string" />
<attr name="desText" format="string" />
<attr name="startColor" format="color" />
<attr name="desColor" format="color" />
<attr name="currentColor" format="color"/>
<!--圆环开始的角度-->
<attr name="startAngel" format="integer" />
<!--圆环总的角度大小-->
<attr name="endAngel" format="integer" />
<attr name="currentAngel" format="integer" />
<attr name="circleWidth" format="integer" />
</declare-styleable>
圆环的代码
package com.renogy.studycustomview.weight;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import com.renogy.studycustomview.R;
/**
* 逆变器的功率显示图
*/
public class InverterHalfView extends View {
//开始功率
private int startPower;
//结束功率
private int endPower;
private String desPower;
//当前功率
private String currentPower;
//开始的字体颜色
private int startColor;
//内容的的字体颜色
private int desColor;
//当前的功率字体颜色
private int currentColor;
//半圆的宽度
private float circleWidth;
//开始角度
private int startAngle;
//圆环的大小角度
private int endAngle;
//圆环的内边距
private int circlePadding = 8;
//开始和结束的画笔
private Paint startPaint = null;
//结束功率的画笔
private Paint desPaint = null;
//当前功率的画笔
private Paint currentPaint = null;
//圆环的画笔
private Paint circlePaint = null;
//圆环的大小
private final int circleDefaultSize = 200;
private float startTextSize = 13f;
private float desTextSize = 20f;
private Context mContext;
//中心点的坐标X
private int centerX;
//中心点的坐标Y
private int centerY;
//圆环半径
private int innerRadius;
//当前的角度
private int currentSweepAng