自定义蜘蛛网状图
运行效果:
绘制分为三步:
1、绘制蜘蛛网格线
2、绘制格中线
3、绘制数据
获取中心点想x,y坐标和半径:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
radius = Math.min(w, h) / 2 * 0.9f;
centerX = w / 2;
centerY = h / 2;
postInvalidate();
super.onSizeChanged(w, h, oldw, oldh);
}
onDraw()方法:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制蜘蛛网格线
drawPolygon(canvas);
//绘制格中线
drawLine(canvas);
//绘制数据
drawRegion(canvas);
}
绘制蜘蛛网格线:
/**
* 绘制蜘蛛网格线
* @param canvas
*/
private void drawPolygon(Canvas canvas) {
Path path = new Path();
//每一圈之间的间距
float r = radius / (count);
for (int i = 1; i <= count; i++) {
//当前圈半径
float curR = r * i;
path.reset();
for (int j = 0; j < count; j++) {
if (j == 0) {
//第一个点
path.moveTo(centerX + curR, centerY);
} else {
//根据半径算出六边形下一个点坐标
float x = (float) (centerX + curR * Math.cos(angle * j));
float y = (float) (centerY + curR * Math.sin(angle * j));
path.lineTo(x, y);
}
}
path.close();
canvas.drawPath(path, radarPaint);
}
}
第一个点的坐标为:(centerX+radius,centerY),下一个点的坐标为:(centerX+radiuscos(α),centerY+radiussin(α)),第三个点是:(centerX+radiuscos(α2),centerY+radiussin(α2))。
通过path.lineTo(x,y)连接路径。循环增加半径绘制。
绘制格中线:
/**
* 绘制格中线
* @param canvas
*/
private void drawLine(Canvas canvas) {
Path path = new Path();
for (int i = 0; i < count; i++) {
path.reset();
path.moveTo(centerX, centerY);
float x = (float) (centerX + radius * Math.cos(angle * i));
float y = (float) (centerY + radius * Math.sin(angle * i));
path.lineTo(x, y);
canvas.drawPath(path, radarPaint);
}
}
绘制数据:
/**
* 绘制数据
* @param canvas
*/
private void drawRegion(Canvas canvas) {
Path path = new Path();
valuePaint.setAlpha(127);
for (int i = 0; i < count; i++) {
double percent = data[i] / maxValue;
float x = (float) (centerX + radius * Math.cos(angle * i) * percent);
float y = (float) (centerY + radius * Math.sin(angle * i) * percent);
if (i == 0) {
path.moveTo(x, centerY);
} else {
path.lineTo(x, y);
}
//绘制圆点
canvas.drawCircle(x, y, 10, valuePaint);
}
valuePaint.setStyle(Paint.Style.FILL_AND_STROKE);
canvas.drawPath(path, valuePaint);
}