有的称为雷达图,也有的说是网状图具体什么图就是这图吧,先看效果

要想实现此图其实也不是很难,由于当时刚见到图的时候有点不知所措,因为不是简单的画圆,而是需要根据数据的大小进行在交叉的地方画点,而且所要画的点是有区域范围的,不同的区域显示的点的颜色是不同的,而且还要把这些点连接起来,当时就感觉有点蒙,不过还好还是做出来了
不扯了上代码

public class RadarView extends View {private int count = 8; // 数据个数private float angle = (float) (Math.PI * 2 / count);private float radius; // 网格最大半径private int centerX; // 中心Xprivate int centerY; // 中心Yprivate String[] titles = { "旅游", "吃饭", "购物", "娱乐", "会友", "转账","红包", "看病" };private double[] data = { 100, 60, 60, 60, 100, 50, 30, 70 }; // 各维度分值private String[] data1 = { "100", "60", "60", "60", "100", "50", "30","70" }; // 各维度分值private float maxValue = 100; // 数据最大值private Paint mainPaint; // 雷达区画笔private Paint valuePaint; // 数据区画笔private Paint textPaint; // 文本画笔private float x1;private float y1;private float curR1;private float curR2;private float curR3;private float x2;private float y2;private float x3;private float y3;private int screenWidth;private int ten;private int twenty;private int thirty;private int forty;private int fifty;private int sixty;private int hun_2;public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}public RadarView(Context context, AttributeSet attrs) {super(context, attrs);init();}public RadarView(Context context) {super(context);init();}// 初始化private void init() {screenWidth = ScreenUtils.getScreenWidth(getContext());ten = (int) (0.0094*screenWidth);twenty = (int) (0.018*screenWidth);thirty = (int) (0.027*screenWidth);forty = (int) (0.036*screenWidth);fifty = (int) (0.045*screenWidth);sixty = (int) (0.054*screenWidth);hun_2 = (int) (0.18*screenWidth);count = Math.min(data.length, titles.length);mainPaint = new Paint();mainPaint.setAntiAlias(true);mainPaint.setColor(Color.parseColor("#6BD18E"));mainPaint.setStyle(Paint.Style.STROKE);valuePaint = new Paint();valuePaint.setAntiAlias(true);valuePaint.setColor(Color.parseColor("#00BF33"));valuePaint.setStyle(Paint.Style.FILL_AND_STROKE);textPaint = new Paint();textPaint.setTextSize(forty);textPaint.setStyle(Paint.Style.FILL);textPaint.setColor(Color.BLACK);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {radius = Math.min(h, w) / 2 * 0.7f;centerX = w / 2;centerY = h / 2;postInvalidate();super.onSizeChanged(w, h, oldw, oldh);}@Overrideprotected void onDraw(Canvas canvas) {drawCircle(canvas);drawLines(canvas);drawText(canvas);drawRegion(canvas);}/*** 绘制圆*/private void drawCircle(Canvas canvas) {Path path = new Path();float r = radius / (count - 1);for (int i = 3; i < count; i += 2) {float curR = r * i;curR1 = r * 3;curR2 = r * 5;curR3 = r * 7;for (int j = 1; j < count; j += 2) {if (j == 0) {path.moveTo(centerX + curR, centerY);} }canvas.drawCircle(centerX, centerX, curR, mainPaint);}}/*** 绘制直线*/private void drawLines(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, mainPaint);}}/*** 绘制文字* * @param canvas*/private void drawText(Canvas canvas) {Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();float fontHeight = fontMetrics.descent - fontMetrics.ascent;for (int i = 0; i < count; i++) {float x = (float) (centerX + (radius + fontHeight / 2)* Math.cos(angle * i));float y = (float) (centerY + (radius + fontHeight / 2)* Math.sin(angle * i));x2 = (float) (centerX + (curR1 + fontHeight / 2)* Math.cos(angle * i));y2 = (float) (centerY + (curR1 + fontHeight / 2)* Math.sin(angle * i));x3 = (float) (centerX + (curR2 + fontHeight / 2)* Math.cos(angle * i));y3 = (float) (centerY + (curR2 + fontHeight / 2)* Math.sin(angle * i));x1 = (float) (centerX + (radius + fontHeight / 2)* Math.cos(angle * i));y1 = (float) (centerY + (radius + fontHeight / 2)* Math.sin(angle * i));float dis = textPaint.measureText(titles[i]);// 文本长度float datadis = valuePaint.measureText(data1[i]);// 文本长度if (angle * i >= 0 && angle * i <= Math.PI / 4) {canvas.drawText(data1[i], x1 - fifty, y1 + ten, textPaint);canvas.drawText(data1[i], x2 - forty, y2 + twenty, textPaint);canvas.drawText(data1[i], x3 - forty, y3 + twenty, textPaint);canvas.drawText(titles[i], x + thirty, y + ten, textPaint);} else if (angle * i >= Math.PI / 4 && angle * i <= Math.PI / 2) {canvas.drawText(data1[i], x2 - ten, y2 + ten, textPaint);canvas.drawText(data1[i], x3 - ten, y3 + ten, textPaint);canvas.drawText(data1[i], x1 - fifty, y1, textPaint);canvas.drawText(titles[i], x + thirty, y + fifty, textPaint);} else if (angle * i >= Math.PI / 2 && angle * i <= Math.PI * 3 / 4) {canvas.drawText(data1[i], x2 - ten, y2 + ten, textPaint);canvas.drawText(data1[i], x3 - ten, y3 + ten, textPaint);canvas.drawText(data1[i], x - twenty, y1 - twenty, textPaint);canvas.drawText(titles[i], x - dis / 2, y + sixty, textPaint);} else if (angle * i >= Math.PI * 3 / 4 && angle * i <= Math.PI) {canvas.drawText(data1[i], x2 - ten, y2 + ten, textPaint);canvas.drawText(data1[i], x3 - ten, y3 + ten, textPaint);canvas.drawText(data1[i], x + ten, y1, textPaint);canvas.drawText(titles[i], x - hun_2, y + fifty, textPaint);} else if (angle * i >= Math.PI && angle * i <= Math.PI * 5 / 4) {canvas.drawText(data1[i], x2 - ten, y2 + ten, textPaint);canvas.drawText(data1[i], x3 - ten, y3 + ten, textPaint);canvas.drawText(data1[i], x - ten, y1 + ten, textPaint);canvas.drawText(titles[i], x - dis - forty, y + ten, textPaint);} else if (angle * i >= Math.PI * 5 / 4&& angle * i <= Math.PI * 3 / 2) {canvas.drawText(data1[i], x2 - ten, y2 + ten, textPaint);canvas.drawText(data1[i], x3 - ten, y3 + ten, textPaint);canvas.drawText(data1[i], x - ten, y1 + ten, textPaint);canvas.drawText(titles[i], x - dis - forty, y - fifty, textPaint);} else if (angle * i >= Math.PI * 3 / 2&& angle * i <= Math.PI * 7 / 4) {canvas.drawText(data1[i], x2 - ten, y2 + twenty, textPaint);canvas.drawText(data1[i], x3 - ten, y3 + twenty, textPaint);canvas.drawText(data1[i], x - ten, y1 + forty, textPaint);canvas.drawText(titles[i], x - dis / 2, y - fifty, textPaint);} else if (angle * i >= Math.PI * 7 / 4 && angle * i <= Math.PI * 2) {canvas.drawText(data1[i], x2 - ten, y2 + twenty, textPaint);canvas.drawText(data1[i], x3 - ten, y3 + twenty, textPaint);canvas.drawText(data1[i], x - twenty, y1 + twenty, textPaint);canvas.drawText(titles[i], x + sixty, y - fifty, textPaint);}}}/*** 绘制区域* * @param canvas*/private void drawRegion(Canvas canvas) {Path path = new Path();valuePaint.setAlpha(255);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);}double sx = Math.PI* ((x - centerX) * (x - centerX) + (y - centerY)* (y - centerY));double s1 = Math.PI * curR1 * curR1;double s2 = Math.PI * curR2 * curR2;double s3 = Math.PI * curR3 * curR3;if (0 < sx && sx <= s1) {valuePaint.setColor(Color.parseColor("#FF2022"));canvas.drawCircle(x, y, ten, valuePaint);}if (s1 < sx && sx <= s2) {valuePaint.setColor(Color.parseColor("#FFA10C"));canvas.drawCircle(x, y, ten, valuePaint);}if (s2 < sx && sx <= s3) {valuePaint.setColor(Color.parseColor("#00BF33"));canvas.drawCircle(x, y, ten, valuePaint);}}valuePaint.setColor(Color.parseColor("#00BF33"));valuePaint.setStyle(Paint.Style.STROKE);canvas.drawPath(path, valuePaint);valuePaint.setAlpha(127);// 绘制填充区域valuePaint.setStyle(Paint.Style.FILL_AND_STROKE);canvas.drawPath(path, valuePaint);}// 设置标题public void setTitles(String[] titles) {this.titles = titles;}// 设置数值public void setData(double[] data) {this.data = data;}public float getMaxValue() {return maxValue;}// 设置最大数值public void setMaxValue(float maxValue) {this.maxValue = maxValue;}// 设置蜘蛛网颜色public void setMainPaintColor(int color) {mainPaint.setColor(color);}// 设置标题颜色public void setTextPaintColor(int color) {textPaint.setColor(color);}// 设置覆盖局域颜色public void setValuePaintColor(int color) {valuePaint.setColor(color);}
}

就是这么一个类花费我大半天时间,粘出来供大家参考,为大家节约一点时间。
如有疑问请加Android技术交流群 50208422或Android交流群 470707794进行技术交流探讨

Android 雷达图(网状图)相关推荐

  1. android 雷达坐标系,Android Path之绘制雷达图的技巧

    Android Path之绘制雷达图的技巧,绘制蜘蛛网络其实就是绘制指定边数的正多边形,这一步比较简单,比较难的可能就是每个顶点的算法,相关注释我都写了,还有一张来自互联网的图以助于思考,如下: 第一 ...

  2. android 微信分享gif图,android后台动态创建图片并实现微信分享

    今天就记录一下. 先说明一下,之前没有做过类似的东西,百度了一两天才知道,说来很惭愧.有点笨,只能这样说. 在我的脑里只明白,如果要动态创建图片: 一.就是new 嘛 二.就是LayoutInflat ...

  3. matlab 三维核密度图_Matlab精彩画图示例:三维网状图和三维曲面图

    接上篇:Matlab精彩画图示例:绘制图上图 这篇介绍两个绘制三维图的命令: mesh - 绘制三维网状图 surf - 绘制三维曲面图 matlab代码如下: 绘制三维图的matlab代码示例 程序 ...

  4. matlab sar 斑马图,星载合成孔径雷达(SAR)斑马图仿真与研究

    收稿日期:2002 - 04 - 22 第 20 卷 第 5 期 计 算 机 仿 真 2003 年 5 月 文章编号:1006 - 9348(2003)05 - 0123 - 04 星载合成孔径雷达( ...

  5. 九.激光SLAM框架学习之LeGO-LOAM框架---速腾Robosense-16线雷达室外建图和其他框架对比、录包和保存数据

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  6. 用户数据销售额分析动态大屏看板+大屏数据可视化图表组件(折线图+圆柱图+散点图+饼图+漏斗图+雷达图+水位图)+智能web端高保真大数据动态可视化大屏看板+中国动态地图+智慧电商实时动态数据大屏看板

    作品内容:用户数据销售额分析动态大屏看板+大屏数据可视化图表组件(折线图+圆柱图+散点图+饼图+漏斗图+雷达图+水位图)+web端高保真大数据动态可视化大屏看板+中国动态地图+电商实时动态数据大屏看板 ...

  7. Android 腾讯优图开发问题总结

    Android 腾讯优图开发问题总结 接入优图检测人脸失败错误码SDK_IMAGE_FACEDETECT_FAILED -1101 具体表现 提供的getBitmap的问题 Bitmap旋转的问题 优 ...

  8. Android APPLogo图片切图大小

    android官方对切图尺寸等都有比较严格的要求,其中提供了一下的尺寸要求 1.比较精细一点 ldpi: 36px mdpi: 48px hdpi: 72px xhdpi: 96px xxhdpi: ...

  9. 关于android中的.9图(一)——如何画.9图

    大家都知道,android中有一种特殊的图片,后缀格式一般是.9.png .这种图片一般都是为了适应在使用过程中可以拉伸而不失真而引入的一种图片.本文中主要介绍9图的画法以及静态用法,所谓的静态用法就 ...

最新文章

  1. python 多线程 多进程 zmq_研二硕, Python +pyqt,多进程问题求助
  2. maven私服nexus搭建(windows)
  3. Android 博客园客户端 (八) 下拉刷新、分页,AsyncTask
  4. git 多用户多仓库配置
  5. Linux文件内容查阅
  6. centos无法启动,修复grub.conf文件
  7. php7 imagick扩展,php7如何安装imagick扩展
  8. Tomcat9安装及配置步骤
  9. 逆向分析-010Editor
  10. 超实用:本科生如何发论文?
  11. H3C模拟器安装及解决各种兼容性问题方法
  12. 互联网上好的博客博主
  13. Power and Modulo(思维)
  14. 微信小程序如何隐藏右上角分享按钮
  15. stm32f107使用外部16MHz晶振
  16. 在线IDE- Gitpod介绍
  17. 推荐系统三十六式(刑无刀)学习笔记(一)
  18. 在没有安装VC软件的电脑上也可以执行的exe文件
  19. Spring Boot 整合 Shiro(三)Kaptcha验证码 附源码
  20. 成功的人都是自律的普通人

热门文章

  1. 计算机网络第六章学习通题目及答案
  2. 张裕葡萄酒将现身“中华老字号故宫过大年”展览活动
  3. Lison《vue技术栈开发实战》(一)
  4. oracle11g新建实例,oracle11gRMAN的catalog的创建和使用
  5. mysql 新闻类表_mysql 数据库 新闻类型
  6. elasticsearch 父子文档使用must not 正确姿势
  7. 【HEVC学习与研究】
  8. 什么是深度学习,如何进行深度学习?
  9. Python Tutorial中英双语对照文档3
  10. 点击li,ul滚动条自动滚动到顶部,怎么解决分享。el-tooltip的focusing不要display:none,隐藏就行