MPAndroidChart_RadarChart雷达图的那些事

简介: 在最近的使用中,用到了RadarChart,也就是雷达图或者说是蜘蛛图,网上对RadarChart的介绍也并不是很多,所以这里来做一个比较详细的介绍。

MPAndroidChart雷达图的那些事

在最近的使用中,用到了RadarChart,也就是雷达图或者说是蜘蛛图,网上对RadarChart的介绍也并不是很多,所以这里来做一个比较详细的介绍。今天我会带给大家一些使用方法,及通过重写源码实现自定义顶点颜色的操作。如果看过我以前帖子的话,那么应该会很快上手的。好啦废话不多说,我们开始吧。


先看一下大概的效果吧。



是不是觉得还不错,那下面我们来看看具体代码吧。


先从布局开始吧,没什么说的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <com.github.mikephil.charting.charts.RadarChart
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

然后来看代码

/**
 * @author Petterp on 2019/5/11
 * Summary:RoadarChart雷达图的使用
 * 邮箱:1509492795@qq.com
 */
public class MainActivity extends AppCompatActivity {
    private RadarChart chart;
    private int[] colors = {Color.RED, Color.BLACK, Color.GREEN, Color.BLUE, Color.GRAY};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initChart();
        setData();
    }
    /**
     * 一些轴上的设置等等
     */
    private void initChart() {
        chart = findViewById(R.id.chart);
        //设置web线的颜色(即就是外面包着的那个颜色)
        chart.setWebColorInner(Color.BLACK);
        //设置中心线颜色(也就是竖着的线条)
        chart.setWebColor(Color.BLACK);
        chart.setWebAlpha(50);
        XAxis xAxis = chart.getXAxis();
        //设置x轴标签字体颜色
        xAxis.setLabelCount(4, true);
        xAxis.setAxisMaximum(4f);
        xAxis.setAxisMinimum(0f);
        xAxis.setTextSize(20f);
        //自定义y轴标签,x轴同理
        xAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
        //这里只是自定义了标签的颜色,如果要使用自定义标签颜色,请更改布局文件为自定为RoadarCharts类
                chart.getXAxis().setTextColor(colors[(int) Math.abs(value % 5)]);
                return super.getFormattedValue(value);
            }
        });
        YAxis yAxis = chart.getYAxis();
        //设置y轴的标签个数
        yAxis.setLabelCount(5, true);
        //设置y轴从0f开始
        yAxis.setAxisMinimum(0f);
        /*启用绘制Y轴顶点标签,这个是最新添加的功能
         * */
        yAxis.setDrawTopYLabelEntry(false);
        //设置字体大小
        yAxis.setTextSize(15f);
        //设置字体颜色
        yAxis.setTextColor(Color.RED);
        //启用线条,如果禁用,则无任何线条
        chart.setDrawWeb(true);
        //禁用图例和图表描述
        chart.getDescription().setEnabled(false);
        chart.getLegend().setEnabled(false);
    }
    /**
     * 设置数据
     */
    private void setData() {
        List<RadarEntry> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(new RadarEntry((float) (Math.random() * 100)));
        }
        RadarDataSet set = new RadarDataSet(list, "Petterp");
        //禁用标签
        set.setDrawValues(false);
        //设置填充颜色
        set.setFillColor(Color.BLUE);
        //设置填充透明度
        set.setFillAlpha(40);
        //设置启用填充
        set.setDrawFilled(true);
        //设置点击之后标签是否显示圆形外围
        set.setDrawHighlightCircleEnabled(true);
        //设置点击之后标签圆形外围的颜色
        set.setHighlightCircleFillColor(Color.RED);
        //设置点击之后标签圆形外围的透明度
        set.setHighlightCircleStrokeAlpha(40);
        //设置点击之后标签圆形外围的半径
        set.setHighlightCircleInnerRadius(20f);
        //设置点击之后标签圆形外围内圆的半径
        set.setHighlightCircleOuterRadius(10f);
        RadarData data = new RadarData(set);
        chart.setData(data);
        chart.invalidate();
    }
}

相应的注释也都在上面,很详细。

这里我们重点提一下自定义标签部分。

重写这两个类 RadarChart和 XAxisRendererRadarChart。其实也就是更改一个方法,别觉得有什么太困难。


我们先看一下为什么我们需要重写源码。


RadarChart源码里并没有提供多颜色标签的方法。点进去setTextColor(),我们可以发现。



我们找getTextColor(),也就是看看在哪里用了这个颜色。


一点发现,好多方法,我们只看我们需要的,比如现在我们要定义的是x轴标签,也就是最外围的标签,所以选择XAxisRendererRadarChart,


进去之后,发现在这里获取了颜色的值,接着往下看



这个方法就是进行我们标签绘制的地方。接着我们开始操作。

/**
 * @author Petterp on 2019/5/11
 * Summary:重写XAxisRendererRadarChart
 * 邮箱:1509492795@qq.com
 */
public class XAxisRendererRandarChart extends XAxisRendererRadarChart {
    private RadarChart mChart;
    public XAxisRendererRandarChart(ViewPortHandler viewPortHandler, XAxis xAxis, RadarChart chart) {
        super(viewPortHandler, xAxis, chart);
        mChart=chart;
    }
    @Override
    public void renderAxisLabels(Canvas c) {
        if (!mXAxis.isEnabled() || !mXAxis.isDrawLabelsEnabled())
            return;
        final float labelRotationAngleDegrees = mXAxis.getLabelRotationAngle();
        final MPPointF drawLabelAnchor = MPPointF.getInstance(0.5f, 0.25f);
        mAxisLabelPaint.setTypeface(mXAxis.getTypeface());
        mAxisLabelPaint.setTextSize(mXAxis.getTextSize());
//        将这句话移到下面
//        mAxisLabelPaint.setColor(mXAxis.getTextColor());
        float sliceangle = mChart.getSliceAngle();
        // calculate the factor that is needed for transforming the value to
        // pixels
        float factor = mChart.getFactor();
        MPPointF center = mChart.getCenterOffsets();
        MPPointF pOut = MPPointF.getInstance(0,0);
        for (int i = 0; i < mChart.getData().getMaxEntryCountSet().getEntryCount(); i++) {
            //这里是改动的地方
            mAxisLabelPaint.setColor(mXAxis.getTextColor());
            String label = mXAxis.getValueFormatter().getAxisLabel(i, mXAxis);
            float angle = (sliceangle * i + mChart.getRotationAngle()) % 360f;
            Utils.getPosition(center, mChart.getYRange() * factor
                    + mXAxis.mLabelRotatedWidth / 2f, angle, pOut);
            drawLabel(c, label, pOut.x, pOut.y - mXAxis.mLabelRotatedHeight / 2.f,
                    drawLabelAnchor, labelRotationAngleDegrees);
        }
        MPPointF.recycleInstance(center);
        MPPointF.recycleInstance(pOut);
        MPPointF.recycleInstance(drawLabelAnchor);
    }
}

但是就这样还不行,我们还需要重写一个类,RadarCharts ,要不然你用的还是官方的类,不就等于没改吗。


所以继续看。



RodarCharts类这里这两个方法,是不是就是刚才我们重新的其中一个。接着往下看。



这里创建了XAxisRendererRadarChart的实例。所以我们需要更改的地方很简单,那就是将这里的类替换成我们的类即可。


这里我就不贴代码了,有点长。也没啥重要的。


最后在布局文件处进行更改,这样就完成了自定义x轴标签,当然我们只做了最简单的几个操作,是不是很简单吧。

<com.petterp.radchart.RadarCharts
    android:id="@+id/chart"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

好了,以上就是MPAndroidChart 雷达图的基本使用了,如果有什么不懂的,也欢迎随时提问,我们一起进步!!!

目录
相关文章
|
11月前
QT实现雷达图和摇杆图
小伙伴们大家好,之前我上传了一个资源(骗积分用的),但是没有效果图和博文与之对应,所以大家应该是都不敢下载的吧, 先上资源链接 : 一个雷达图和一个摇杆图(方向可以根据你自己的需要增加)资源 再上效果图。
277 1
QT实现雷达图和摇杆图
|
存储 传感器 编解码
turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
|
2月前
|
传感器
示例八、火焰传感器
示例八、火焰传感器
20 1
|
2月前
四维雷达图
四维雷达图
21 0
|
2月前
|
存储 数据可视化 关系型数据库
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
|
12月前
|
计算机视觉
【状态估计】基于卡尔曼滤波器和扩展卡尔曼滤波器用于 INS/GNSS 导航、目标跟踪和地形参考导航研究(Matlab代码实现)
【状态估计】基于卡尔曼滤波器和扩展卡尔曼滤波器用于 INS/GNSS 导航、目标跟踪和地形参考导航研究(Matlab代码实现)
|
9月前
112Echarts - 雷达图(Proportion of Browsers)
112Echarts - 雷达图(Proportion of Browsers)
13 0
|
12月前
|
机器学习/深度学习 传感器 安全
【天线】基于matlab绘制天线方向图绘制
【天线】基于matlab绘制天线方向图绘制
|
11月前
|
机器学习/深度学习 算法
【目标识别】检测具有相同背景的不同图像并找到图像中的红色圆圈目标(Matlab代码实现)
【目标识别】检测具有相同背景的不同图像并找到图像中的红色圆圈目标(Matlab代码实现)
|
机器学习/深度学习 传感器 算法
【雷达通信】基于matlab K分布雷达杂波建模与仿真
【雷达通信】基于matlab K分布雷达杂波建模与仿真