用Kotlin自定义雷达图-DimensionRadarView
第一步,确定雷达图中必要元素
一般的雷达图样式
如图,可以看出图中的雷达图包含了文字标签说明,组成雷达图的线条,评分覆盖区域的颜色。
1.文字标签确定了雷达图有几个顶点
2.线条明确告诉我们可以用Path画出雷达图
3.评分覆盖区域则表明我们需要一个评分数组和对应的颜色
styleable属性设置
<declare-styleable name="DimensionRadarView">
<attr name="scoreLevel" format="integer" /><!--评分级别-->
<attr name="maxScore" format="integer" /><!--最高评分-->
<attr name="dimensionRotateDegree" format="float" /><!--雷达图旋转的角度-->
<attr name="dimensionTextSize" format="dimension" /><!--标签的字体大小-->
<attr name="diagonalLineColor" format="color" /><!--对角线的颜色-->
<attr name="diagonalLineWidth" format="dimension" /><!--对角线的宽度-->
<attr name="sideLineColor" format="color" /><!--边线的颜色-->
<attr name="sideLineWidth" format="dimension" /><!--边线的宽度-->
<attr name="maxSupportScoreNumber" format="integer" /><!--最大支持的评分个数-->
<attr name="dimensionRadarBackgroundColor" format="color" /><!--雷达图的背景-->
<attr name="scoreLevelDrawStyle"><!--评分区域的覆盖模式-->
<enum name="full" value="0" />
<enum name="stroke" value="1" />
</attr>
<attr name="dimensionTextArray" format="reference" /><!--评分标签数组,确定维度-->
<attr name="dimensionTextColorArray" format="reference" /><!--评分标签文字的颜色-->
<attr name="dimensionRadarScoreColorArray" format="reference" /><!--评分区域颜色数组-->
<attr name="dimensionScoreLevelArray" format="reference" /><!--评分数组-->
</declare-styleable>
第二步,画出雷达图
获取styleable中的属性
context.obtainStyledAttributes(attrs, R.styleable.DimensionRadarView)?.run {
getTextArray(R.styleable.DimensionRadarView_dimensionTextArray)?.forEach {
dimensionTextList.add(it.toString())
}
getTextArray(R.styleable.DimensionRadarView_dimensionRadarScoreColorArray)?.forEachIndexed {
index, it ->
scoreColorArray.add(
try {
Color.parseColor(it?.toString())
} catch (e: java.lang.IllegalArgumentException) {
DEFAULT_SCORE_COLOR
})
}
dimensionTextColorArray = IntArray(divideCount) {
DEFAULT_TEXT_COLOR }
getTextArray(R.styleable.DimensionRadarView_dimensionTextColorArray)?.forEachIndexed {
index, it ->
if (index < divideCount) {
dimensionTextColorArray[index] =
try {
Color.parseColor(it.toString())
} catch (e: IllegalArgumentException) {
DEFAULT_TEXT_COLOR
}
}
}
maxSupportScore