Android雷达图(蜘蛛网图)

简介

最近因为项目的需要,需要实现雷达图来展示各科目的对题率。

雷达图的绘制不算复杂,只要按照一定的流程来绘制就可以了,其中使用的最多的是path路径类,使用这个类便于我们绘制出多边形等效果。

效果图如下:

使用方式

使用方式很简单,直接在布局文件里面使用这个控件,记得设置一个合适的大小就可以。

当然也有开放一些public方法,可以进行数据、文本颜色等设置。

    /**
     * 设置数据
     * @param points
     */
    public void setData(ArrayList<LastPoint> points){}

    /**
     * 设置文本
     * @param titles
     */
    public void setTitles(String[] titles){}

    /**
     * 设置圈数
     * @param count
     */
    public void setCount(int count){}

    /**
     * 设置网格线颜色
     * @param color
     */
    public void setLineColor(int color){}

    /**
     * 设置填充区域颜色
     * @param color
     */
    public void setValueColor(int color){}

    /**
     * 设置文本颜色
     * @param color
     */
    public void setTextColor(int color){}

具体实现

一般自定义控件的流程有以下几个步骤(个人观点):

* 1、构造函数(初始化)* 2、onMeasure(测量大小)* 3、onSizeChanged(确定大小)* 4、onLayout(子view的位置,如果包含子view的话)* 5、onDraw(绘制内容)* 6、暴露给外部的接口

在该控件中,2、4都不用考虑,只要确定了大小(onSizeChanged),就能够计算出整个布局的中心,雷达图是以这个中心开始绘制的。

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;     //中心坐标
        mCenterX = mWidth/2;
        mCenterY = mHeight/2;
        mRadius = (Math.min(mWidth,mHeight)/2 * 0.9f);
        postInvalidate();
    }

  

绘制蜘蛛网图

    /**
     * 画网格
     * @param canvas
     */
    private void drawLine(Canvas canvas){
        Path path = new Path();
        //网格线之间的间距
        float distance =  mRadius / (mCount-1);
        for (int i = 0; i < mCount; i++){//外面的网格图形
            float currentRadius = i * distance;//当前半径
            if (i == mCount -1){
                //存储最后一圈网格的点的坐标
                mLastPoints.add(new LastPoint(currentRadius,0));
                mLastPoints.add(new LastPoint(currentRadius/2,-currentRadius));
                mLastPoints.add(new LastPoint(-currentRadius/2,-currentRadius));
                mLastPoints.add(new LastPoint(-currentRadius,0));
                mLastPoints.add(new LastPoint(-currentRadius/2,currentRadius));
                mLastPoints.add(new LastPoint(currentRadius/2,currentRadius));
            }
            //6个点坐标组成一个网格图形
            path.lineTo(currentRadius,0);
            //设置上一次操作的坐标点
            path.moveTo(currentRadius,0);
            path.lineTo(currentRadius/2,-currentRadius);
            path.lineTo(-currentRadius/2,-currentRadius);
            path.lineTo(-currentRadius,0);
            path.lineTo(-currentRadius/2,currentRadius);
            path.lineTo(currentRadius/2,currentRadius);
            path.close();
            canvas.drawPath(path,mLinePaint);
        }
    }

绘制从中心到末端的直线

    /**
     * 画网格对角线
     * @param canvas
     */
    private void drawGridLine(Canvas canvas){
        Path path = new Path();
        for (int i = 0; i < mLastPoints.size(); i++){
            path.reset();
            LastPoint point = mLastPoints.get(i);
            float x = point.x;
            float y = point.y;
            path.lineTo(x, y);
            canvas.drawPath(path, mLinePaint);
        }
    }

绘制末端文本

由于文本与末端有一定的距离,所以需要加上一定的偏移量;当文本在网格左边显示的时候,会与网格有重叠,所以需要先计算文本长度,然后再向左边偏移对应的距离,这样就可以解决重叠问题。

    /**
     * 画文本
     * @param canvas
     */
    private void drawText(Canvas canvas){
        for (int i = 0; i < mLastPoints.size(); i++){
            //文本长度
            float dis = mTextPaint.measureText(mTitles[i]);

            LastPoint point = mLastPoints.get(i);
            float x = point.x;
            float y = point.y;
            if (i == 2 || i == 3 || i == 4){
                //左边绘制文本:文本显示在坐标左边
                x = x - dis;
            }
            if (y > 0){
                y+=18;
            }
            canvas.drawText(mTitles[i],x,y,mTextPaint);
        }
    }

绘制填充区域

    /**
     * 画数据线:填充区域
     * @param canvas
     */
    private void drawDataLine(Canvas canvas){
        if (mDataPoints == null || mDataPoints.size() == 0)
            return;
        Path path = new Path();
        for (int i = 0; i < mDataPoints.size(); i++){
            LastPoint point = mDataPoints.get(i);
            float x = point.x;
            float y = point.y;
            path.lineTo(x, y);
            if (i == 0){//将上一次操作点移到第一个点坐标,保证最后调用close,形成一个封闭的形状
                path.moveTo(x,y);
            }
            mValuePaint.setAlpha(255);
            //画小圆点
            canvas.drawCircle(x,y,8,mValuePaint);
        }
        path.close();
        mValuePaint.setAlpha(127);
        canvas.drawPath(path, mValuePaint);

    }

时间: 2024-08-26 15:43:06

Android雷达图(蜘蛛网图)的相关文章

自定义蜘蛛网图 NetView

概述 写论文忙里偷闲写了一个蜘蛛网图的自定义view,支持多重属性 有图才能有真相,下面先上图 主要支持网格颜色.tag文本.覆盖区域颜色.透明度的属性改变,具体使用可以参见我的githubgithub完整下载,求互粉求start,下面主要介绍一下实现这个自定义控件的几个关键点. 确定属性 首先要知道这个控件需要暴露出哪些属性,创建一个attrs.xml <?xml version="1.0" encoding="utf-8"?> <resourc

javascript雷达图/星形图/极坐标图Radar &amp; Polar chart介绍

Radar & Polar chart 控件为软件开发人员提供了雷达图/星形图/极坐标图,它以轴上的同一个点为起点,绘制出三个或更多的变量. 具体功能: 任意多的轴 动态或静态 简单.堆积.100%堆积的图表 网格线能转换为圆环 在轴之间进行填充 以自定义范围值填充 跨平台 导出为图像 可通过JavaScript进行控制 可直接通过HTML文件进行设置和数据交换 自定义图像和Flash(动态)背景 无限的标签 可旋转的标签 可使用预设频率重新加载数据 格式任何气球文本 Amcharts可以从简单

Android MediaPlayer 框架UML图

Android开发交流群:50342056 目的 本文用一个UML类图,讲解mp3文件播放的框架流程.内容以下几个方面: 1.UML类图 2.stagefrightPlayer是如何创建的: 3.mp3文件的解析和解码的简单介绍 4.播放mp3文件过程中,生产者和消费者的关系: 5.openmax和stagefright框架的消息机制 UML类图 stagefrightPlayer是如何创建的 对照着UML图,看下StagefrightPlayer创建的过程. 故事的开始是Java层的Media

Android 特效View第四弹之折线图 心率图

Android 特效View第四弹之折线图 心率图 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.empty.ChartView android:id="@+id/chart" android:layout_width="wrap_content" and

关于Android Studio中点9图的编译错误问题

Android中的点9图想必大家都非常熟悉了,能够指定背景图片的缩放区域和文本内容的显示区域,常见如QQ聊天界面的背景气泡这种文本内容不固定并需要适配的应用场景. 这里也给大家准备了一张图,详细介绍了一下"Android设计中的.9.png",大家可以点击放大查看: 以前在使用Eclipse时候很少会出现点9图的编译错误问题,但是在转向Android Studio的过程中,你可能会遇到.比如你将Eclipse项目转化为Android Studio项目,或者在自己的项目中引入点9图,然后

Android版CAD看图软件如何打开CAD图纸

CAD图纸的查看现在不仅仅只局限于使用电脑查看,它也可以使用手机查看,今天教大家的就是如何使用Android版CAD看图查看图纸! 第一步:首先要去到手机应用商店中下载一款CAD看图软件,小编使用的就是迅捷CAD看图,需要的可以去到应用商店中下载 第二步:下载完成后在桌面中找到迅捷CAD看图软件并进入 第三步:如果你是第一次打开上面最近打开的显示中有一个示例文件可供参考 第四步:今天就以示例为例点击打开就好了 如果您还想了解更多或是想要下载其他有关CAD方面的软件的话,你可以直接进入我们的官网h

UML建模之 - 类图&amp;时序图

简介 简介 UML是面向对象开发中一种通用的图形化建模语言 UML建模技术就是用模型元素来组建整个系统的模型,模型元素包括系统中的类.类和类之间的关联.类的实例相互配合实现系统的动态行为等 UML建模工具 Rational Rose : 是直接从UML发展而诞生的设计工具,常用建模工具 Power Designer : 是对数据库建模而发展起来的一种数据库建模工具 Microsoft Visio :是一种画图工具,Visio 2010才开始引入UML建模,不是很专业 Star UML : 开源轻

php验证码+缩略图+饼状图+五环图

@1.验证码 1 captcher.php 2 header('Content-type:image/png'); 3 session_start(); 4 $img = imagecreate(100, 30); 5 $captcha = array( 6 'a', 'b', 'c', 'd', 'e', 'f', 7 'g', 'h', 'i', 'j', 'k', 'l', 8 'm', 'n', 'o', 'p', 'q', 'r', 9 's', 't', 'u', 'v', 'w',

银光甘特图/日历图/排程控件GTP.NET for Silverlight详细介绍

GTP.NET for Silverlight是Silverlight下的控件包,提供了交互式的甘特图以及日程安排图,达到时间上可视化和交互,控件完全分发免费.方案网作为PlexityHide在中国的核心代理商,为客户提供优质的客服和技术支持.                          具体功能: 提供了丰富的用户界面直接运行于Silverlight插件下 使用Silverlight开发,达到了跨平台的目的,包括Apple Machintosh和 Microsoft Windows 提供