MPAndroidChart折线图一

背景:
MPAndroidChart折线图,是由于项目中要用到,所以这次把在做的过程中,所用到的api(网上很多,所以这里不是重点),以及遇到的问题和怎样解决问题写了这篇文章。如果过程中有问题,希望大家及时的提出来,一起共同进步。

一、直接上需求效果图
这里写图片描述

随着移动x轴坐标,对应的时间点和扫码次数都发生改变。当是x轴是24小时显示的时候,要求x轴每隔6个小时显示,如上图。如果是日期或者其他时间,x轴只显示开始和末尾的时间点。当移动x轴坐标的时候,lebal标签上的时间(即x轴)和统计的数据(即y轴)数据也发生不断的改变。

二、功能的实现(基本API的介绍)
1、设置图表数据

public void loadLineChartData() {
        //所有线的List
        ArrayList<LineDataSet> allLinesList = new ArrayList<LineDataSet>();
//        Entry(yValue,xIndex);一个Entry表示一个点,第一个参数为y值,第二个为X轴List的角标
        ArrayList<Entry> entryList = new ArrayList<Entry>();

        for (int i = 0; i < mList.size(); i++)
        {
            Map.Entry<String, Integer> mapEntry = Tools.fstMapEntry(mList.get(i));
            String time = mapEntry.getKey();   //时间
            //x轴方向上的坐标值(时间)
            xVals.add(time);
            ContentUtil.makeLog("time----",time);
            //                y轴方向数据
            int type = mapEntry.getValue();     //统计的数据
            types.add(type);

            //Entry(yValue,xIndex);一个Entry表示一个点,第一个参数为y值,第二个为X轴List的角标
            entryList.add(new Entry(type, i));
            ContentUtil.makeLog("type------",type + "");

        }

        //LineDataSet可以看做是一条线
        LineDataSet dataSet = new LineDataSet(entryList, "dataLine");
        dataSet.setLineWidth(2.5f);
        dataSet.setCircleSize(4.5f);
        dataSet.setHighLightColor(Color.RED); // 设置点击某个点时,横竖两条线的颜色
        dataSet.setDrawValues(false); // 是否在点上绘制Value
        //        dataSet.setValueTextColor(Color.WHITE);
        dataSet.setValueTextSize(24f);
        //        图标上的点的数据是否用小圆圈标示
        dataSet.setDrawCircles(false);
        //设置允许曲线平滑
        dataSet.setDrawCubic(true);
        //        设置折线的平滑度
        dataSet.setCubicIntensity(0.4f);
        //        设置允许填充
        dataSet.setDrawFilled(true);
        dataSet.setColor(Color.WHITE);
        //        设置填充颜色
        dataSet.setFillColor(context.getResources().getColor(R.color.table_content_color));
        allLinesList.add(dataSet);

        //LineData表示一个LineChart的所有数据(即一个LineChart中所有折线的数据)
        LineData mChartData = new LineData(xVals, allLinesList);

        // set data
        chart.setData((LineData) mChartData);
        //        标签数据的设置
// 动态设置标签的数据
 LineChartMarkerView markerView = new LineChartMarkerView(context, R.layout.label_view, typeName,mList,mLabelTime,mLabelData);
            chart.setMarkerView(markerView);
            markerView.invalidate();
//        }
        chart.setVisibleYRangeMaximum(50f,YAxis.AxisDependency.LEFT);
        chart.moveViewToY(60,YAxis.AxisDependency.LEFT);
    }

2、设置图表样式

public void setLineChartStyle() {
        // 设置手势
        //        chart.setOnChartGestureListener(this);
        chart.setDrawGridBackground(false); // 设置网格背景
        chart.setTouchEnabled(true);        //设置表格是否有触摸事件
        chart.setDoubleTapToZoomEnabled(true);
        chart.setScaleEnabled(false); // 设置缩放
        chart.setDoubleTapToZoomEnabled(false); // 设置双击不进行缩放
        chart.setAutoScaleMinMaxEnabled(false);
        chart.setDrawBorders(false);//是否在折线图上添加边框
        chart.setDescription("");
//      chart.setDragEnabled(true);// 是否可以拖拽
        // 设置X轴
        XAxis xAxis = chart.getXAxis();
        xAxis.setAvoidFirstLastClipping(true);  //x轴上起点和终点坐标数显示不完全
        if ("1".equals(mDateStart)) {
            xAxis.setLabelsToSkip(5);           //设置x轴相邻两个点的间隔5个时间,如0:00,6:00,12:00
            ContentUtil.makeLog("ToSkip--","000000000");
        }else {
            //其他时间,只显示首末的时间
            xAxis.setLabelsToSkip(xVals.size() -2);
            ContentUtil.makeLog("ToSkip--","1111111111");
        }


        //        xAxis.setTypeface(mTf); // 设置字体
        xAxis.setEnabled(true);
        xAxis.setDrawGridLines(false);
        xAxis.setSpaceBetweenLabels(1);
        //      让x轴在上面
        xAxis.setPosition(XAxis.XAxisPosition.TOP);
//        设置x轴字体的颜色
    xAxis.setTextColor(context.getResources().getColor(R.color.share_text_color));
        // 图例
        chart.getLegend().setEnabled(false);
        YAxis axisRight = chart.getAxisRight();
        // 隐藏右边 的坐标轴
        axisRight.setEnabled(false);
        axisRight.setAxisMinValue(-10);
        //隐藏右边坐标轴横网格线
        axisRight.setDrawGridLines(false);
        //隐藏左边坐标轴横网格线
        YAxis axisLeft = chart.getAxisLeft();
        axisLeft.setDrawGridLines(false);
        axisLeft.setEnabled(false);
        // 获得左侧侧坐标轴
        YAxis leftAxis = chart.getAxisLeft();
        //        leftAxis.setValueFormatter(new MyYAxisValueFormatter());
        leftAxis.setTextSize(18f);
        leftAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
        //设置右侧坐标轴
        YAxis rightAxis = chart.getAxisRight();
        rightAxis.setDrawAxisLine(false); // 右侧坐标轴线
        rightAxis.setDrawLabels(false); // 右侧坐标轴数组Label
    }

MPAndroidChart是一个强大的开源库,用于在Android应用中创建图表,包括折线图、饼图等多种类型。以下是使用MPAndroidChart创建折线图的基本步骤: 1. **添加依赖**:首先,你需要在你的`build.gradle`文件中添加依赖到你的项目里: ```gradle implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' ``` 2. **初始化图表视图**:在布局XML文件中,添加一个`LineChart`组件,并设置其id,如`line_chart`: ```xml <com.github.mikephil.charting.charts.LineChart android:id="@+id/line_chart" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. **数据准备**:收集你要显示的数据点,每个点包含x轴值和y轴值。例如,你可以创建一个`Entry`数组: ```java List<Entry> entries = new ArrayList<>(); entries.add(new Entry(xValue1, yValue1)); // 添加更多数据... ``` 4. **创建系列(Series)**:创建一个`LineDataSet`,配置线条颜色、样式等属性,并将数据添加到系列中: ```java LineDataSet dataSet = new LineDataSet(entries, "Temperature"); dataSet.setColor(Color.BLUE); // 设置系列的样式等... ``` 5. **创建数据集集合(DataSets)**:如果你需要展示多个数据系列,可以创建多个`LineDataSet`并加入到`LineData`中: ```java LineData data = new LineData(dataSet); if (series2 != null) { data.addDataSet(series2); } ``` 6. **设置图表**:将数据集添加到图表上,并配置其他选项,如X轴和Y轴标签,网格线等: ```java LineChart chart = findViewById(R.id.line_chart); chart.setData(data); chart.getXAxis().setDrawGridLines(true); chart.getYAxis().setEnabled(false); // 可选配置 ``` 7. **更新图表**:最后,在适当的时候调用`chart.invalidate()`来刷新图表,显示新的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值