Android MPAndroid chart图表案例

        由于有关于Android mpAndroidchart使用文章网上较多,本文就不一一列举使用步骤,只涉及案例。

一、效果

二、实现步骤

1、在Android工程模块文件build.gradle引入//图表库MPandroid chart


    //图表库MPandroid chart
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha'

2、Android工程文件build.gradle添加 maven { url "JitPack | Publish JVM and Android libraries" }


allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
        ...
    }

3、 折现图布局文件相关

1、chart_shape.xml图表背景


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="@dimen/dp_0"></corners>
    <solid android:color="@color/color_white"></solid>
</shape>

2、布局文件activity_main.xml


<?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"
    android:orientation="vertical"
    tools:ignore="MissingDefaultResource">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="@dimen/dp_30"
            android:background="@color/color_white"
            android:orientation="vertical">

            <TextView
                android:id="@+id/mv_position"
                android:layout_width="@dimen/dp_60"
                android:layout_height="@dimen/dp_40"
                android:layout_marginTop="@dimen/dp_30"
                android:gravity="center"
                android:text="移动" />

            <RelativeLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="@dimen/dp_20"
                android:paddingRight="@dimen/dp_20">

                <com.github.mikephil.charting.charts.LineChart
                    android:id="@+id/line_cdf"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_160"
                    android:layout_marginBottom="@dimen/dp_10"
                    android:background="@drawable/chart_shape" />
            </RelativeLayout>


            <RelativeLayout
                android:id="@+id/content_cdf"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="@dimen/dp_20"
                android:paddingRight="@dimen/dp_20">

                <com.github.mikephil.charting.charts.LineChart
                    android:id="@+id/line_cdf_chart"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/dp_160"
                    android:layout_marginBottom="@dimen/dp_10"
                    android:background="@drawable/chart_shape" />
            </RelativeLayout>

            <com.github.mikephil.charting.charts.PieChart
                android:id="@+id/pie_chart"
                android:layout_width="280dp"
                android:layout_height="280dp"
                android:layout_gravity="center"
                android:layout_marginTop="@dimen/dp_30" />

        </LinearLayout>
    </ScrollView>
</LinearLayout>

3、带marker的折线图封装



public class IECDfLinearChart {


    // 折线编号
    public static final int LINE_NUMBER_0 = 0;
    public static final int LINE_NUMBER_1 = 1;
    public static final int LINE_NUMBER_2 = 2;
    public static final int LINE_NUMBER_3 = 3;
    public static final int LINE_NUMBER_4 = 4;
    public static final int LINE_NUMBER_5 = 5;
    public static final int LINE_NUMBER_6 = 6;

    private LineData mLineData; // 线集合,所有折现以数组的形式存到此集合中
    private XAxis mXAxis; //X轴
    private YAxis mLeftYAxis; //左侧Y轴
    private YAxis mRightYAxis; //右侧Y轴
    private Legend mLegend; //图例

    // Y值数据链表
    private List<Float> mList1 = new ArrayList<>();
    private List<Float> mList2 = new ArrayList<>();
    private List<Float> mList3 = new ArrayList<>();
    private List<Float> mList4 = new ArrayList<>();
    private List<Float> mList5 = new ArrayList<>();
    private List<Float> mList6 = new ArrayList<>();
    private List<Float> mList7 = new ArrayList<>();

    // Chart需要的点数据链表
    private List<Entry> mEntries1 = new ArrayList<>();
    private List<Entry> mEntries2 = new ArrayList<>();
    private List<Entry> mEntries3 = new ArrayList<>();
    private List<Entry> mEntries4 = new ArrayList<>();
    private List<Entry> mEntries5 = new ArrayList<>();
    private List<Entry> mEntries6 = new ArrayList<>();
    private List<Entry> mEntries7 = new ArrayList<>();

    // LineDataSet:点集合,即一条线
    private LineDataSet mLineDataSet1 = new LineDataSet(mEntries1, "");
    private LineDataSet mLineDataSet2 = new LineDataSet(mEntries2, "");
    private LineDataSet mLineDataSet3 = new LineDataSet(mEntries3, "");
    private LineDataSet mLineDataSet4 = new LineDataSet(mEntries4, "");
    private LineDataSet mLineDataSet5 = new LineDataSet(mEntries5, "");
    private LineDataSet mLineDataSet6 = new LineDataSet(mEntries6, "");
    private LineDataSet mLineDataSet7 = new LineDataSet(mEntries7, "");

    private LineChart lineChart;

    private List<String> stData;

    private Context mContext;

    private LineChartMarkView mv;

    /**
     * 功能:初始
     * 化LineChart
     */
    public IECDfLinearChart(LineChart mlineChart, int days, List<String> st, Context mContext) {
        count.clear();
        lineChart = mlineChart;
        mXAxis = lineChart.getXAxis(); // 得到x轴
        mLeftYAxis = lineChart.getAxisLeft(); // 得到侧Y轴
        mRightYAxis = lineChart.getAxisRight(); // 得到右侧Y轴
        mLegend = lineChart.getLegend(); // 得到图例
        mLineData = new LineData();

        stData = st;

        //图列隐藏
        mLegend.setEnabled(false);
        lineChart.setData(mLineData);
        // 设置图标基本属性
        setChartBasicAttr();
        // 设置XY轴
        setXYAxis(mXAxis, mLeftYAxis, mRightYAxis, days);
        // 添加线条
        initLine();
        // 设置图例
        createLegend(mLegend);

        // 设置MarkerView
        mContext = mContext;

        setMarkerView(lineChart, mContext);
    }

    /**
     * 功能:设置
     * 图标的基本属性
     */
    public void setChartBasicAttr() {
        /***图表设置***/

        lineChart.setDrawGridBackground(false); //是否展示网格线
        lineChart.setDrawBorders(false); //是否显示边界
        lineChart.setDragEnabled(true); //是否可以拖动
        lineChart.setScaleEnabled(false); // 是否可以缩放
        lineChart.setTouchEnabled(true); //是否有触摸事件
        //设置XY轴描述
        Description description = new Description();
        description.setEnabled(false);
        description.setText("s");
        lineChart.setDescription(description);

        //设置XY轴动画效果
//        lineChart.animateY(1000);
//        lineChart.animateX(1000);
        lineChart.animateXY(1000, 1000);
    }

    /**
     * 功能:设置XY轴
     */
    private List<String> count = new ArrayList<>();
    private String content = "";

    String s;

    public void setXYAxis(XAxis xAxis, YAxis leftYAxis, YAxis rightYAxis, int dayDt) {
        /***XY轴的设置***/
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //X轴设置显示位置在底部
        xAxis.setAxisMinimum(0f); // 设置X轴的最小值
        xAxis.setAxisMaximum(dayDt); // 设置X轴的最大值
        xAxis.setLabelCount(8, true); // 设置X轴的刻度数量,第二个参数表示是否平均分配
        xAxis.setGranularity(1f); // 设置X轴坐标之间的最小间隔
        xAxis.setEnabled(true);
        xAxis.setTextColor(Color.parseColor("#333333"));

        for (int i = 0; i < dayDt; i++) {//自定义X轴坐标

            if (i < stData.size()) {
                s = "" + stData.get(i) + "";
            } else {
                s = "";
            }

            Log.d("mumu", "======setXYAxis:===== " + s + "==cishu===" + i);
            count.add(s);
        }

        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                if ((int) value < count.size()) {
                    return count.get((int) value);
                } else {
                    return "";
                }
            }
        });

        xAxis.setXOffset(20);
        xAxis.setDrawGridLines(false);

//        lineChart.setVisibleXRangeMaximum(31);// 当前统计图表中最多在x轴坐标线上显示的总量

        //保证Y轴从0开始,不然会上移一点
        leftYAxis.setAxisMinimum(0f);
        rightYAxis.setAxisMinimum(0f);//右侧Y轴数据

        leftYAxis.setAxisMaximum(10f);
        rightYAxis.setAxisMaximum(10f);//右侧Y轴数据

        leftYAxis.setGranularity(1f);
        rightYAxis.setGranularity(1f);//右侧Y轴数据
        rightYAxis.setEnabled(false);
        rightYAxis.setDrawAxisLine(false);

        rightYAxis.setLabelCount(5);
        leftYAxis.setLabelCount(5);//刻度数

        lineChart.setVisibleYRangeMaximum(100, YAxis.AxisDependency.LEFT);// 当前统计图表中最多在Y轴坐标线上显示的总量
        lineChart.setVisibleYRangeMaximum(100, YAxis.AxisDependency.RIGHT);// 当前统计图表中最多在Y轴坐标线上显示的总量
        leftYAxis.setEnabled(true);
        leftYAxis.setDrawAxisLine(false);
        leftYAxis.setTextColor(Color.parseColor("#333333"));

//        leftYAxis.setCenterAxisLabels(true);// 将轴标记居中
//        leftYAxis.setDrawZeroLine(true); // 原点处绘制 一条线
//        leftYAxis.setZeroLineColor(Color.RED);
//        leftYAxis.setZeroLineWidth(1f);
    }

    /**
     * 功能:对图表中的曲线初始化,添加三条,并且默认显示第一条
     */
    public void initLine() {

        createLine(mList1, mEntries1, mLineDataSet1, Color.parseColor("#3BED65"), mLineData);//青
        createLine(mList2, mEntries2, mLineDataSet2, Color.parseColor("#FFCD00"), mLineData);//黄
        createLine(mList3, mEntries3, mLineDataSet3, Color.parseColor("#007AFF"), mLineData);//蓝
        createLine(mList4, mEntries4, mLineDataSet4, Color.parseColor("#F44336"), mLineData);//红
        createLine(mList5, mEntries5, mLineDataSet5, Color.parseColor("#E93AFF"), mLineData);//紫
        createLine(mList6, mEntries6, mLineDataSet6, Color.parseColor("#EA4AFF"), mLineData);//紫
        createLine(mList7, mEntries7, mLineDataSet7, Color.parseColor("#039bF6"), mLineData);//青蓝色


        // mLineData.getDataSetCount() 总线条数
        // mLineData.getEntryCount() 总点数
        // mLineData.getDataSetByIndex(index).getEntryCount() 索引index处折线的总点数
        // 每条曲线添加到mLineData后,从索引0处开始排列
        for (int i = 0; i < mLineData.getDataSetCount(); i++) {
            lineChart.getLineData().getDataSets().get(i).setVisible(false); //
        }
        showLine(LINE_NUMBER_0);
        showLine(LINE_NUMBER_1);
        showLine(LINE_NUMBER_2);
        showLine(LINE_NUMBER_3);
        showLine(LINE_NUMBER_4);
        showLine(LINE_NUMBER_5);
        showLine(LINE_NUMBER_6);
    }

    /**
     * 功能:根据索引显示
     * 或隐藏指定线条
     */
    public void showLine(int index) {
        lineChart
                .getLineData()
                .getDataSets()
                .get(index)
                .setVisible(true);
        lineChart.invalidate();
    }

    /**
     * 功能:动态
     * 创建一条曲线
     */
    private void createLine(List<Float> dataList, List<Entry> entries, LineDataSet lineDataSet, int color, LineData lineData) {
        for (int i = 0; i < dataList.size(); i++) {
            /**
             * 在此可查看 Entry构造方法,可发现 可传入数值 Entry(float x, float y)
             * 也可传入Drawable, Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示
             */
            Entry entry = new Entry(i, dataList.get(i));// Entry(x,y)
            entries.add(entry);
        }

        // 初始化线条
        initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);

        if (lineData == null) {
            lineData = new LineData();
            lineData.addDataSet(lineDataSet);
            lineChart.setData(lineData);
        } else {
            lineChart.getLineData().addDataSet(lineDataSet);
        }
        lineChart.invalidate();
    }

    /**
     * 曲线初始化设置,
     * 一个LineDataSet
     * 代表一条曲线
     *
     * @param lineDataSet 线条
     * @param color       线条颜色
     * @param mode
     */
    public void initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
        lineDataSet.setColor(color); // 设置曲线颜色
        lineDataSet.setCircleColor(color);  // 设置数据点圆形的颜色
        lineDataSet.setDrawCircleHole(false);// 设置曲线值的圆点是否是空心

        lineDataSet.setLineWidth(2f); // 设置折线宽度
        lineDataSet.setCircleRadius(1f); // 设置折现点圆点半径
        lineDataSet.setValueTextSize(0f);//数值文字大小

        lineDataSet.setDrawFilled(false); //设置折线图填充
        lineDataSet.setFormLineWidth(0f);
        lineDataSet.setFormSize(0f);

        if (mode == null) {
            //设置曲线展示为圆滑曲线(如果不设置则默认折线)
            lineDataSet.setMode(LineDataSet.Mode.LINEAR);
        } else {
            lineDataSet.setMode(mode);
        }
    }

    /**
     * 功能:创建图例
     */
    public void createLegend(Legend legend) {
        /***折线图例 标签 设置***/
        //设置显示类型,LINE CIRCLE SQUARE EMPTY 等等 多种方式,查看LegendForm 即可
        legend.setForm(Legend.LegendForm.CIRCLE);
        legend.setTextColor(R.color.color_grey_3);
        legend.setTextSize(12f);
        //显示位置 左下方
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        //是否绘制在图表里面
        legend.setDrawInside(false);
        legend.setEnabled(true);
    }

    /**
     * 设置 可以显示X Y
     * 轴自定义值的 MarkerView
     */
    public void setMarkerView(LineChart lineChart, Context context) {

        mv = new LineChartMarkView(context);
        mv.setChartView(lineChart);
        lineChart.setMarker(mv);
        lineChart.invalidate();

    }

    /**
     * 动态添加数据
     * 在一个LineChart中存放的折线,
     * 其实是以索引从0开始编号的
     *
     * @paramyValues y值
     */
    public void addEntry(LineData lineData, List<Float> pdfList, int index) {

        for (int y = 0; y < pdfList.size(); y++) {
            // 通过索引得到一条折线,之后得到折线上当前点的数量
            int xCount = lineData.getDataSetByIndex(index).getEntryCount() + 1;

//        Entry entry = new Entry(xCount, yValues); // 创建一个点
            lineData.addEntry(new Entry(xCount, pdfList.get(y).floatValue()), index); // 将entry添加到指定索引处的折线中

            //通知数据已经改变
            lineData.notifyDataChanged();
            lineChart.notifyDataSetChanged();

            //把yValues移到指定索引的位置
            lineChart.moveViewToAnimated(xCount - 42, pdfList.get(y).floatValue(), YAxis.AxisDependency.LEFT, 1000);//42个右移
            lineChart.invalidate();
        }
    }

    /**
     * 功能:第1条折线
     * 添加一个点
     */

    public void addLine0Data(List<Float> pdflist, int pdfMaxValue, List<DataRecord> records) {

        YMacValue(pdfMaxValue);
        addEntry(mLineData, pdflist, LINE_NUMBER_0);

        mv.showData(records, pdflist, 1);

    }


    /**
     * 功能:第2条折线
     */
    public void addLine1Data(List<Float> pdflist, int pdfMaxValue, List<DataRecord> records) {

        YMacValue(pdfMaxValue);
        addEntry(mLineData, pdflist, LINE_NUMBER_1);
        mv.showData(records, pdflist, 2);
    }

    /**
     * 功能:第3条折线
     */
    public void addLine2Data(List<Float> pdflist, int pdfMaxValue, List<DataRecord> records) {

        YMacValue(pdfMaxValue);
        addEntry(mLineData, pdflist, LINE_NUMBER_2);
        mv.showData(records, pdflist, 3);
    }

    /**
     * 功能:第4条折线
     */
    public void addLine3Data(List<Float> pdflist, int pdfMaxValue, List<DataRecord> records) {

        YMacValue(pdfMaxValue);
        addEntry(mLineData, pdflist, LINE_NUMBER_3);
        mv.showData(records, pdflist, 4);
    }

    /**
     * 功能:第5条折线
     */
    public void addLine4Data(List<Float> pdflist, int pdfMaxValue, List<DataRecord> records) {

        YMacValue(pdfMaxValue);
        addEntry(mLineData, pdflist, LINE_NUMBER_4);

        mv.showData(records, pdflist, 5);
    }

    /**
     * 功能:第6条折线
     */
    public void addLine5Data(List<Float> pdflist, int pdfMaxValue, List<DataRecord> records) {

        YMacValue(pdfMaxValue);
        addEntry(mLineData, pdflist, LINE_NUMBER_5);

        mv.showData(records, pdflist, 6);
    }

    /**
     * 功能:第7条折线
     */
    public void addLine6Data(List<Float> pdflist, int pdfMaxValue, List<DataRecord> records) {

        YMacValue(pdfMaxValue);
        addEntry(mLineData, pdflist, LINE_NUMBER_6);

        mv.showData(records, pdflist, 7);
    }


    /**
     * 对纵轴坐标最大值
     * 做数据适配
     */
    private void YMacValue(float v) {

        if (v > mLeftYAxis.getAxisMaximum()) {
            if (v > 10 && v <= 20) {
                mLeftYAxis.setAxisMaximum(20);
            } else if (20 < v && v <= 50) {
                mLeftYAxis.setAxisMaximum(50);
            } else if (50 < v && v <= 105) {
                mLeftYAxis.setAxisMaximum(105);
            } else if (105 < v && v <= 250) {
                mLeftYAxis.setAxisMaximum(250);
            } else if (250 < v && v <= 500) {
                mLeftYAxis.setAxisMaximum(500);
            } else if (500 < v && v <= 1000) {
                mLeftYAxis.setAxisMaximum(1000);
            } else if (1000 < v && v <= 1500) {
                mLeftYAxis.setAxisMaximum(1500);
            } else if (1500 < v && v <= 2000) {
                mLeftYAxis.setAxisMaximum(2000);
            } else if (2000 < v && v <= 2500) {
                mLeftYAxis.setAxisMaximum(2500);
            } else if (2500 < v && v <= 3000) {
                mLeftYAxis.setAxisMaximum(3000);
            } else if (3000 < v && v <= 4000) {
                mLeftYAxis.setAxisMaximum(4000);
            } else if (4000 < v && v <= 5000) {
                mLeftYAxis.setAxisMaximum(5000);
            } else if (5000 < v && v <= 6000) {
                mLeftYAxis.setAxisMaximum(6000);
            } else if (6000 < v && v <= 7000) {
                mLeftYAxis.setAxisMaximum(7000);
            } else if (7000 < v && v <= 8000) {
                mLeftYAxis.setAxisMaximum(8000);
            } else {
                mLeftYAxis.setAxisMaximum(10000);
            }
        }

    }


}

4、不带marker折现封装



public class OkLinearChart {


    // 折线编号
    public static final int LINE_NUMBER_1 = 0;

    private LineData mLineData; // 线集合,所有折现以数组的形式存到此集合中
    private XAxis mXAxis; //X轴
    private YAxis mLeftYAxis; //左侧Y轴
    private YAxis mRightYAxis; //右侧Y轴
    private Legend mLegend; //图例

    //  Y值数据链表
    private List<Float> mList1 = new ArrayList<>();

    // Chart需要的点数据链表
    private List<Entry> mEntries1 = new ArrayList<>();

    // LineDataSet:点集合,即一条线
    private LineDataSet mLineDataSet1 = new LineDataSet(mEntries1, "");

    /**
     * 功能:初始化LineChart
     */
    public OkLinearChart(LineChart lineChart) {
        count.clear();
        this.lineChart = lineChart;
        mXAxis = lineChart.getXAxis(); // 得到x轴
        mLeftYAxis = lineChart.getAxisLeft(); // 得到侧Y轴
        mRightYAxis = lineChart.getAxisRight(); // 得到右侧Y轴
        mLegend = lineChart.getLegend(); // 得到图例
        mLineData = new LineData();
        //图列隐藏
        mLegend.setEnabled(false);
        lineChart.setData(mLineData);
        // 设置图标基本属性
        setChartBasicAttr(lineChart);
        // 设置XY轴
        setXYAxis(lineChart, mXAxis, mLeftYAxis, mRightYAxis);
        // 添加线条
        initLine(lineChart);
        // 设置图例
        createLegend(mLegend);
        // 设置MarkerView
//        setMarkerView(mLineChart);
    }

    /**
     * 功能:设置图标的基本属性
     */
    public void setChartBasicAttr(LineChart lineChart) {
        /***图表设置***/

        lineChart.setDrawGridBackground(false); //是否展示网格线
        lineChart.setDrawBorders(false); //是否显示边界
        lineChart.setDragEnabled(false); //是否可以拖动
        lineChart.setScaleEnabled(false); // 是否可以缩放
        lineChart.setTouchEnabled(true); //是否有触摸事件
        //设置XY轴描述
        Description description = new Description();
        description.setEnabled(false);
        description.setText("s");
        lineChart.setDescription(description);

        //设置XY轴动画效果
//        lineChart.animateY(1000);
//        lineChart.animateX(1000);
        lineChart.animateXY(1000, 1000);
    }

    /**
     * 功能:设置XY轴
     */
    private List<String> count = new ArrayList<>();
    private String content = "";

    String s;
    private int startXdata = 0;

    public void setXYAxis(LineChart lineChart, XAxis xAxis, YAxis leftYAxis, YAxis rightYAxis) {
        /***XY轴的设置***/
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //X轴设置显示位置在底部
        xAxis.setAxisMinimum(0f); // 设置X轴的最小值
        xAxis.setAxisMaximum(10000000); // 设置X轴的最大值
        xAxis.setLabelCount(11, false); // 设置X轴的刻度数量,第二个参数表示是否平均分配
        xAxis.setGranularity(1f); // 设置X轴坐标之间的最小间隔
        xAxis.setEnabled(true);
        xAxis.setTextColor(Color.parseColor("#333333"));

//        startXdata = -205;
//        for (int i = 0; i < 41; i++) {
//            startXdata = startXdata + 5;
//            s = "-" + startXdata;
//            Log.d("mumu", "======setXYAxis:===== " + s + "==cishu===" + i);
//            count.add(s);
//        }

        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
//                if ((int) value < count.size()) {
//                return count.get((int) value);
//                } else {
                return "" + (int) value;
//                }
            }
        });

        xAxis.setXOffset(20);
        xAxis.setDrawGridLines(false);

        lineChart.setVisibleXRangeMaximum(21);// 当前统计图表中最多在x轴坐标线上显示的总量

        //保证Y轴从0开始,不然会上移一点
        leftYAxis.setAxisMinimum(0f);
        rightYAxis.setAxisMinimum(0f);//右侧Y轴数据

        leftYAxis.setAxisMaximum(10f);
        rightYAxis.setAxisMaximum(10f);//右侧Y轴数据

        leftYAxis.setGranularity(1f);
        rightYAxis.setGranularity(1f);//右侧Y轴数据
        rightYAxis.setEnabled(false);

        rightYAxis.setLabelCount(10);
        leftYAxis.setLabelCount(10);//刻度数

        lineChart.setVisibleYRangeMaximum(100, YAxis.AxisDependency.LEFT);// 当前统计图表中最多在Y轴坐标线上显示的总量
        lineChart.setVisibleYRangeMaximum(100, YAxis.AxisDependency.RIGHT);// 当前统计图表中最多在Y轴坐标线上显示的总量
        leftYAxis.setEnabled(true);
        leftYAxis.setDrawAxisLine(false);
        leftYAxis.setTextColor(Color.parseColor("#333333"));

//        leftYAxis.setCenterAxisLabels(true);// 将轴标记居中
//        leftYAxis.setDrawZeroLine(true); // 原点处绘制 一条线
//        leftYAxis.setZeroLineColor(Color.RED);
//        leftYAxis.setZeroLineWidth(1f);
    }

    /**
     * 功能:对图表中的曲线初始化,添加三条,并且默认显示第一条
     */
    public void initLine(LineChart lineChart) {

        createLine(mList1, mEntries1, mLineDataSet1, Color.parseColor("#4fc3fe"), mLineData, lineChart);

        // mLineData.getDataSetCount() 总线条数
        // mLineData.getEntryCount() 总点数
        // mLineData.getDataSetByIndex(index).getEntryCount() 索引index处折线的总点数
        // 每条曲线添加到mLineData后,从索引0处开始排列
        for (int i = 0; i < mLineData.getDataSetCount(); i++) {
            lineChart.getLineData().getDataSets().get(i).setVisible(false); //
        }
        showLine(LINE_NUMBER_1, lineChart);
    }

    /**
     * 功能:根据索引显示或隐藏指定线条
     */
    public void showLine(int index, LineChart lineChart) {
        lineChart
                .getLineData()
                .getDataSets()
                .get(index)
                .setVisible(true);
        lineChart.invalidate();
    }

    /**
     * 功能:动态创建一条曲线
     */
    private void createLine(List<Float> dataList, List<Entry> entries, LineDataSet lineDataSet, int color, LineData lineData, LineChart lineChart) {
        for (int i = 0; i < dataList.size(); i++) {
            /**
             * 在此可查看 Entry构造方法,可发现 可传入数值 Entry(float x, float y)
             * 也可传入Drawable, Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示
             */
            Entry entry = new Entry(i, dataList.get(i));// Entry(x,y)
            entries.add(entry);
        }

        // 初始化线条
        initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);

        if (lineData == null) {
            lineData = new LineData();
            lineData.addDataSet(lineDataSet);
            lineChart.setData(lineData);
        } else {
            lineChart.getLineData().addDataSet(lineDataSet);
        }
        lineChart.invalidate();
    }

    /**
     * 曲线初始化设置,一个LineDataSet 代表一条曲线
     *
     * @param lineDataSet 线条
     * @param color       线条颜色
     * @param mode
     */
    public void initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
        lineDataSet.setColor(color); // 设置曲线颜色
        lineDataSet.setCircleColor(color);  // 设置数据点圆形的颜色
        lineDataSet.setDrawCircleHole(false);// 设置曲线值的圆点是否是空心

        lineDataSet.setLineWidth(2f); // 设置折线宽度
        lineDataSet.setCircleRadius(2f); // 设置折现点圆点半径
        lineDataSet.setValueTextSize(0f);//数值文字大小

        lineDataSet.setDrawFilled(false); //设置折线图填充
        lineDataSet.setFormLineWidth(0f);
        lineDataSet.setFormSize(0f);

        if (mode == null) {
            //设置曲线展示为圆滑曲线(如果不设置则默认折线)
            lineDataSet.setMode(LineDataSet.Mode.LINEAR);
        } else {
            lineDataSet.setMode(mode);
        }
    }

    /**
     * 功能:创建图例
     */
    public void createLegend(Legend legend) {
        /***折线图例 标签 设置***/
        //设置显示类型,LINE CIRCLE SQUARE EMPTY 等等 多种方式,查看LegendForm 即可
        legend.setForm(Legend.LegendForm.CIRCLE);
        legend.setTextColor(R.color.rect_color);
        legend.setTextSize(12f);
        //显示位置 左下方
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        //是否绘制在图表里面
        legend.setDrawInside(false);
        legend.setEnabled(true);
    }

    /**
     * 设置 可以显示X Y 轴自定义值的 MarkerView
     */
    public void setMarkerView(LineChart lineChart, Context context) {
//        LineChartMarkViewDemo mv = new LineChartMarkViewDemo(context);
//        mv.setChartView(lineChart);
//        lineChart.setMarker(mv);
//        lineChart.invalidate();
    }

    /**
     * 动态添加数据
     * 在一个LineChart中存放的折线,其实是以索引从0开始编号的
     *
     * @paramyValues y值
     */
    public void addEntry(LineData lineData, LineChart lineChart, Float pdfList, int index) {

        // 通过索引得到一条折线,之后得到折线上当前点的数量
        int xCount = lineData.getDataSetByIndex(index).getEntryCount() + 1;

        //  Entry entry = new Entry(xCount, yValues); // 创建一个点
        lineData.addEntry(new Entry(xCount, pdfList.floatValue()), index); // 将entry添加到指定索引处的折线中

        //通知数据已经改变
        lineData.notifyDataChanged();
        lineChart.notifyDataSetChanged();

        //把yValues移到指定索引的位置
        lineChart.moveViewToAnimated(xCount - 18, pdfList.floatValue(), YAxis.AxisDependency.LEFT, 1000);//18个右移
        lineChart.invalidate();

    }

    /**
     * 功能:第1条折线
     * 添加一个点
     */

    public void addLine1Data(Float pdflist, LineChart lineChart, int pdfMaxValue) {

        YMacValue(pdfMaxValue);

        addEntry(mLineData, lineChart, pdflist, LINE_NUMBER_1);

    }

    /**
     * 纵轴坐标数据
     */
    private void YMacValue(float v) {

        if (v > mLeftYAxis.getAxisMaximum()) {
            if (v > 10 && v <= 20) {
                mLeftYAxis.setAxisMaximum(20);
            } else if (20 < v && v <= 50) {
                mLeftYAxis.setAxisMaximum(50);
            } else if (50 < v && v <= 105) {
                mLeftYAxis.setAxisMaximum(105);
            } else if (105 < v && v <= 250) {
                mLeftYAxis.setAxisMaximum(250);
            } else if (250 < v && v <= 500) {
                mLeftYAxis.setAxisMaximum(500);
            } else if (500 < v && v < 1000) {
                mLeftYAxis.setAxisMaximum(1000);
            } else if (1000 < v && v < 1500) {
                mLeftYAxis.setAxisMaximum(1500);
            } else if (1500 < v && v < 2000) {
                mLeftYAxis.setAxisMaximum(2000);
            } else if (2000 < v && v < 2500) {
                mLeftYAxis.setAxisMaximum(2500);
            } else if (2500 < v && v < 3000) {
                mLeftYAxis.setAxisMaximum(3000);
            } else {
                mLeftYAxis.setAxisMaximum(5000);
            }
        }

    }

    private LineChart lineChart;

    public void mvToPosion(float v) {
        lineChart.moveViewToX(v);

        lineChart.centerViewTo((float) 5, (float) 0, YAxis.AxisDependency.LEFT);
        lineChart.invalidate();
    }

5、marker封装



public class LineChartMarkView extends MarkerView {

    private TextView tvDate;
    private TextView tvValue;
    //    private IAxisValueFormatter xAxisValueFormatter;
    DecimalFormat df = new DecimalFormat(".00");
    private TextView tvThree;
    private TextView tvFour;
    private TextView tvFive;

    public LineChartMarkView(Context context) {
        super(context, R.layout.layout_linear_mark);
//        this.xAxisValueFormatter = xAxisValueFormatter;
        pdflist1.clear();
        pdflist2.clear();
        pdflist3.clear();
        pdflist4.clear();
        pdflist5.clear();

        one = -1;
        two = -1;
        three = -1;
        four = -1;
        five = -1;

        initView();
    }

    private List<Float> pdflist1 = new ArrayList<>();
    private List<Float> pdflist2 = new ArrayList<>();
    private List<Float> pdflist3 = new ArrayList<>();
    private List<Float> pdflist4 = new ArrayList<>();
    private List<Float> pdflist5 = new ArrayList<>();

    private int one = -1;
    private int two = -1;
    private int three = -1;
    private int four = -1;
    private int five = -1;


    @SuppressLint("SetTextI18n")
    @Override
    public void refreshContent(Entry e, Highlight highlight) {
        //展示自定义X轴值 后的X轴内容

        tvValue.setVisibility(GONE);
        tvThree.setVisibility(GONE);
        tvFour.setVisibility(GONE);
        tvFive.setVisibility(GONE);
        tvDate.setText("" + e.getY());

//        tvValue.setText("我的收益:" + df.format(e.getY() * 100) + "%");
//        tvThree.setText("");
//        tvFour.setText("");
//        tvFive.setText("");

        if (mRecords.size() == 0) {
            tvDate.setVisibility(GONE);
            tvValue.setVisibility(GONE);
            tvThree.setVisibility(GONE);
            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (mRecords.size() == 1) {
            tvDate.setVisibility(VISIBLE);

            tvDate.setText(mRecords.get(0).getCatNumber() + "    " + pdflist1.get((int) (e.getX() - 1)));
            tvValue.setVisibility(GONE);
            tvThree.setVisibility(GONE);
            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (mRecords.size() == 2) {

            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);

            tvDate.setText(mRecords.get(0).getCatNumber() + "    " + pdflist1.get((int) (e.getX() - 1)));
            tvValue.setText(mRecords.get(1).getCatNumber() + "    " + pdflist2.get((int) (e.getX() - 1)));

            tvThree.setVisibility(GONE);
            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (mRecords.size() == 3) {

            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);
            tvThree.setVisibility(VISIBLE);


            tvDate.setText(mRecords.get(0).getCatNumber() + "    " + pdflist1.get((int) (e.getX() - 1)));
            tvValue.setText(mRecords.get(1).getCatNumber() + "    " + pdflist2.get((int) (e.getX() - 1)));
            tvThree.setText(mRecords.get(2).getCatNumber() + "    " + pdflist3.get((int) (e.getX() - 1)));

            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (mRecords.size() == 4) {

            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);
            tvThree.setVisibility(VISIBLE);
            tvFour.setVisibility(VISIBLE);


            tvDate.setText(mRecords.get(0).getCatNumber() + "    " + pdflist1.get((int) (e.getX() - 1)));
            tvValue.setText(mRecords.get(1).getCatNumber() + "    " + pdflist2.get((int) (e.getX() - 1)));
            tvThree.setText(mRecords.get(2).getCatNumber() + "    " + pdflist3.get((int) (e.getX() - 1)));
            tvFour.setText(mRecords.get(3).getCatNumber() + "    " + pdflist4.get((int) (e.getX() - 1)));

            tvFive.setVisibility(GONE);
        }

        if (mRecords.size() == 5) {
            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);
            tvThree.setVisibility(VISIBLE);
            tvFour.setVisibility(VISIBLE);
            tvFive.setVisibility(VISIBLE);


            tvDate.setText(mRecords.get(0).getCatNumber() + "    " + pdflist1.get((int) (e.getX() - 1)));
            tvValue.setText(mRecords.get(1).getCatNumber() + "    " + pdflist2.get((int) (e.getX() - 1)));
            tvThree.setText(mRecords.get(2).getCatNumber() + "    " + pdflist3.get((int) (e.getX() - 1)));
            tvFour.setText(mRecords.get(3).getCatNumber() + "    " + pdflist4.get((int) (e.getX() - 1)));
            tvFive.setText(mRecords.get(4).getCatNumber() + "    " + pdflist5.get((int) (e.getX() - 1)));
        }


        super.refreshContent(e, highlight);
    }

    @Override
    public MPPointF getOffset() {
        return new MPPointF(-(getWidth() / 2), -getHeight());
    }

    /**
     * 布局
     * 初始化
     */
    private void initView() {
        tvDate = findViewById(R.id.tv_date);
        tvValue = findViewById(R.id.tv_value);
        tvThree = (TextView) findViewById(R.id.tv_three);
        tvFour = (TextView) findViewById(R.id.tv_four);
        tvFive = (TextView) findViewById(R.id.tv_five);
    }

    private List<DataRecord> mRecords = new ArrayList<>();

    /**
     * 显示数据
     *
     * @parami
     * @params
     */

    public void showData(List<DataRecord> records, List<Float> pdflist, int n) {

        mRecords.clear();

        mRecords.addAll(records);

        if (n == 1) {
            one = 1;
            pdflist1.clear();
            pdflist1.addAll(pdflist);
        }

        if (n == 2) {
            two = 2;
            pdflist2.clear();
            pdflist2.addAll(pdflist);
        }

        if (n == 3) {
            three = 3;
            pdflist3.clear();
            pdflist3.addAll(pdflist);
        }

        if (n == 4) {
            three = 4;
            pdflist4.clear();
            pdflist4.addAll(pdflist);
        }

        if (n == 5) {
            three = 5;
            pdflist5.clear();
            pdflist5.addAll(pdflist);
        }


        if (records.size() == 0) {
            tvDate.setVisibility(GONE);
            tvValue.setVisibility(GONE);
            tvThree.setVisibility(GONE);
            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (records.size() == 1) {
            tvDate.setVisibility(VISIBLE);

            tvDate.setText(records.get(0).getCatNumber() + "    " + records.get(0).getKmData());
            tvValue.setVisibility(GONE);
            tvThree.setVisibility(GONE);
            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (records.size() == 2) {

            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);

            tvDate.setText(records.get(0).getCatNumber() + "    " + records.get(0).getKmData());
            tvValue.setText(records.get(1).getCatNumber() + "    " + records.get(1).getKmData());

            tvThree.setVisibility(GONE);
            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (records.size() == 3) {

            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);
            tvThree.setVisibility(VISIBLE);


            tvDate.setText(records.get(0).getCatNumber() + "    " + records.get(0).getKmData());
            tvValue.setText(records.get(1).getCatNumber() + "    " + records.get(1).getKmData());
            tvThree.setText(records.get(2).getCatNumber() + "    " + records.get(2).getKmData());

            tvFour.setVisibility(GONE);
            tvFive.setVisibility(GONE);
        }

        if (records.size() == 4) {

            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);
            tvThree.setVisibility(VISIBLE);
            tvFour.setVisibility(VISIBLE);


            tvDate.setText(records.get(0).getCatNumber() + "    " + records.get(0).getKmData());
            tvValue.setText(records.get(1).getCatNumber() + "    " + records.get(1).getKmData());
            tvThree.setText(records.get(2).getCatNumber() + "    " + records.get(2).getKmData());
            tvFour.setText(records.get(3).getCatNumber() + "    " + records.get(3).getKmData());

            tvFive.setVisibility(GONE);
        }

        if (records.size() == 5) {
            tvDate.setVisibility(VISIBLE);
            tvValue.setVisibility(VISIBLE);
            tvThree.setVisibility(VISIBLE);
            tvFour.setVisibility(VISIBLE);
            tvFive.setVisibility(VISIBLE);


            tvDate.setText(records.get(0).getCatNumber() + "    " + records.get(0).getKmData());
            tvValue.setText(records.get(1).getCatNumber() + "    " + records.get(1).getKmData());
            tvThree.setText(records.get(2).getCatNumber() + "    " + records.get(2).getKmData());
            tvFour.setText(records.get(3).getCatNumber() + "    " + records.get(3).getKmData());
            tvFive.setText(records.get(4).getCatNumber() + "    " + records.get(4).getKmData());
        }

    }

}

6、activity界面代码

marker的数量直接这么赋值即可
 
 List<DataRecord> records1 = new ArrayList<>();
        DataRecord re1 = new DataRecord();
        re1.setCatNumber("湘A2345");
        re1.setColor("#3BED65");
 
        DataRecord re2 = new DataRecord();
        re2.setCatNumber("湘D0221");
        re2.setColor("#3BED65");
 
        DataRecord re3 = new DataRecord();
        re3.setCatNumber("湘C9998");
        re3.setColor("#3BED65");
        records1.add(re1);
        records1.add(re2);
        records1.add(re3);

可以把  List<DataRecord> records1 = new ArrayList<>();
        DataRecord re1=new DataRecord();
        re1.setCatNumber("111111");
        re1.setCatNumber("湘A2345");
        re1.setColor("#3BED65");

改成上面部分可实现markerview 不同名称对应不同的值



public class MainActivity extends AppCompatActivity {

    private PieChart chart;//饼状图
    private Typeface tf;

    private List<Float> cdfDotList;//数据点集合
    private IECDfLinearChart iecDfLinearChart;//cdf

    private OkLinearChart okLinearChart;//cdf无mark标记折线
    private LineChart line_cdf_chart;
    private LineChart line_cdf;

    private TextView mvPosition;//移动数据

    protected final String[] parties = new String[]{
            "Party A", "Party B", "Party C", "Party D", "Party E", "Party F", "Party G", "Party H",
            "Party I", "Party J", "Party K", "Party L", "Party M", "Party N", "Party O", "Party P",
            "Party Q", "Party R", "Party S", "Party T", "Party U", "Party V", "Party W", "Party X",
            "Party Y", "Party Z"
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    /**
     * 布局
     * 文件
     */
    protected void initView() {

        line_cdf_chart = findViewById(R.id.line_cdf_chart);

        //数据
        line_cdf = findViewById(R.id.line_cdf);
        okLinearChart = new OkLinearChart(line_cdf);

        //数据

        dealData();

        chart = findViewById(R.id.pie_chart);
        mvPosition = findViewById(R.id.mv_position);
        mvPosition.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                float s = 6;

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        okLinearChart.mvToPosion(s);
                    }
                });

            }
        });

        showData((float) 40);
        showData((float) 50);
        showData((float) 20);
        showData((float) 70);
        showData((float) 80);
        showData((float) 60);

        handler.postDelayed(runnable, 1000);


        chart.setUsePercentValues(true);//设置是否使用百分值,默认为false https://blog.csdn.net/Honiler/article/details/80073883 属性介绍

        chart.getDescription().setEnabled(false);

        chart.setDragDecelerationFrictionCoef(0.95f);

        tf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");


        chart.setExtraOffsets(25.f, 0.f, 25.f, 0.f);

        chart.setDrawHoleEnabled(true);//是否启用空洞,默认为true
        chart.setHoleColor(Color.WHITE);//设置空洞颜色

        chart.setTransparentCircleColor(Color.WHITE);//设置半透明圆颜色,默认为白色
        chart.setTransparentCircleAlpha(105);//半透明圆,设置半透明圆透明度, 默认为105

        chart.setHoleRadius(40f);//设置空洞半径, 默认为
        chart.setTransparentCircleRadius(48f);//设置半透明圆半径占饼图半径百分比,默认为55%

        chart.setDrawCenterText(true);//设置是否绘制中间文本,默认为true
        chart.setCenterText("共20个");

        chart.setRotationAngle(0);
        // enable rotation of the chart by touch
        chart.setRotationEnabled(true);
        chart.setHighlightPerTapEnabled(true);


        chart.animateY(1400, Easing.EaseInOutQuad);
        // chart.spin(2000, 0, 360);

        Legend l = chart.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
        l.setOrientation(Legend.LegendOrientation.VERTICAL);
        l.setDrawInside(false);
        l.setEnabled(false);

        setData(5, 100);

    }


    /**
     * 设置数据
     */
    private List<Float> mList2 = new ArrayList<>();
    private List<Float> mList3 = new ArrayList<>();
    private List<Float> mList4 = new ArrayList<>();
    private List<Float> mList5 = new ArrayList<>();
    private List<String> sd = new ArrayList<>();

    private void dealData() {
        cdfDotList = new ArrayList<>();
        iecDfLinearChart = new IECDfLinearChart(line_cdf_chart, 30, sd, this);

        List<DataRecord> records1 = new ArrayList<>();
        DataRecord re1=new DataRecord();
        re1.setCatNumber("111111");
        re1.setCatNumber("湘A2345");
        re1.setColor("#3BED65");

        cdfDotList.add((float) 80.1); records1.add(re1);
        cdfDotList.add((float) 20.1);records1.add(re1);
        cdfDotList.add((float) 40.1);records1.add(re1);
        cdfDotList.add((float) 30.1);records1.add(re1);
        cdfDotList.add((float) 20.1);records1.add(re1);
        cdfDotList.add((float) 10.1);
        cdfDotList.add((float) 60.1);
        cdfDotList.add((float) 80.1);
        cdfDotList.add((float) 90.1);
        cdfDotList.add((float) 90.1);
        cdfDotList.add((float) 100.1);
        cdfDotList.add((float) 60.1);
        cdfDotList.add((float) 70.1);
        cdfDotList.add((float) 30.1);
        cdfDotList.add((float) 80.1);
        cdfDotList.add((float) 90.1);
        cdfDotList.add((float) 80.1);
        cdfDotList.add((float) 70.1);
        cdfDotList.add((float) 60.1);
        cdfDotList.add((float) 90.1);
        cdfDotList.add((float) 60.1);
        cdfDotList.add((float) 90.1);
        cdfDotList.add((float) 60.1);
        cdfDotList.add((float) 10.1);
        cdfDotList.add((float) 40.1);
        cdfDotList.add((float) 20.1);
        cdfDotList.add((float) 30.1);
        cdfDotList.add((float) 90.1);
        cdfDotList.add((float) 60.1);
        cdfDotList.add((float) 30.1);
        cdfDotList.add((float) 60.1);

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                iecDfLinearChart.addLine0Data(cdfDotList, 200, records1);
            }
        });

        List<DataRecord> records2 = new ArrayList<>();

        mList2.add((float) 10.1);records2.add(re1);//marker数据可以删掉
        mList2.add((float) 60.1);records2.add(re1);
        mList2.add((float) 20.1);records2.add(re1);
        mList2.add((float) 30.1);records2.add(re1);
        mList2.add((float) 50.1);records2.add(re1);
        mList2.add((float) 70.1);
        mList2.add((float) 60.1);
        mList2.add((float) 80.1);
        mList2.add((float) 90.1);
        mList2.add((float) 100.1);
        mList2.add((float) 34.1);
        mList2.add((float) 32.1);
        mList2.add((float) 54.1);
        mList2.add((float) 43.1);
        mList2.add((float) 56.1);
        mList2.add((float) 65.1);
        mList2.add((float) 66.1);//marker数据可以删掉
        mList2.add((float) 80.1);
        mList2.add((float) 90.1);
        mList2.add((float) 100.1);
        mList2.add((float) 90.1);
        mList2.add((float) 100.1);
        mList2.add((float) 90.1);
        mList2.add((float) 100.1);
        mList2.add((float) 34.1);
        mList2.add((float) 66.1);
        mList2.add((float) 60.1);
        mList2.add((float) 100.1);
        mList2.add((float) 90.1);
        mList2.add((float) 60.1);
        mList2.add((float) 90.1);


        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                iecDfLinearChart.addLine1Data(mList2, 200, records2);
            }
        });

        List<DataRecord> records3 = new ArrayList<>();
        mList3.add((float) 70.1);records3.add(re1);//marker数据可以删掉
        mList3.add((float) 200.1);records3.add(re1);
        mList3.add((float) 20.1);records3.add(re1);
        mList3.add((float) 20.1);records3.add(re1);
        mList3.add((float) 20.1);records3.add(re1);
        mList3.add((float) 30.1);
        mList3.add((float) 50.1);
        mList3.add((float) 50.1);
        mList3.add((float) 50.1);
        mList3.add((float) 50.1);
        mList3.add((float) 100.1);
        mList3.add((float) 160.1);
        mList3.add((float) 180.1);
        mList3.add((float) 190.1);
        mList3.add((float) 120.1);
        mList3.add((float) 120.1);
        mList3.add((float) 120.1);
        mList3.add((float) 134.1);
        mList3.add((float) 134.1);
        mList3.add((float) 134.1);
        mList3.add((float) 132.1);
        mList3.add((float) 154.1);
        mList3.add((float) 143.1);
        mList3.add((float) 143.1);
        mList3.add((float) 143.1);
        mList3.add((float) 156.1);
        mList3.add((float) 165.1);
        mList3.add((float) 166.1);
        mList3.add((float) 180.1);
        mList3.add((float) 190.1);
        mList3.add((float) 190.1);


        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                iecDfLinearChart.addLine2Data(mList3, 200, records3);
            }
        });

        List<DataRecord> records4 = new ArrayList<>();

        mList4.add((float) 0.1);records4.add(re1);//marker数据可以删掉
        mList4.add((float) 120.1);records4.add(re1);
        mList4.add((float) 130.1);records4.add(re1);
        mList4.add((float) 60.1);records4.add(re1);
        mList4.add((float) 70.1);records4.add(re1);
        mList4.add((float) 110.1);
        mList4.add((float) 140.1);
        mList4.add((float) 190.1);
        mList4.add((float) 90.1);
        mList4.add((float) 20.1);
        mList4.add((float) 134.1);
        mList4.add((float) 12.1);
        mList4.add((float) 15.1);
        mList4.add((float) 14.1);
        mList4.add((float) 16.1);
        mList4.add((float) 35.1);
        mList4.add((float) 66.1);
        mList4.add((float) 57.1);
        mList4.add((float) 68.1);
        mList4.add((float) 67.1);
        mList4.add((float) 62.1);
        mList4.add((float) 69.1);
        mList4.add((float) 66.1);
        mList4.add((float) 67.1);
        mList4.add((float) 62.1);
        mList4.add((float) 63.1);
        mList4.add((float) 64.1);
        mList4.add((float) 65.1);
        mList4.add((float) 67.1);
        mList4.add((float) 67.1);
        mList4.add((float) 67.1);


        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                iecDfLinearChart.addLine3Data(mList4, 200, records4);
            }
        });

        List<DataRecord> records5 = new ArrayList<>();

        mList5.add((float) 11.1);records5.add(re1);
        mList5.add((float) 22.1);records5.add(re1);
        mList5.add((float) 40.1);records5.add(re1);
        mList5.add((float) 34.1);records5.add(re1);
        mList5.add((float) 55.1);records5.add(re1);
        mList5.add((float) 60.1);
        mList5.add((float) 140.1);
        mList5.add((float) 200.1);
        mList5.add((float) 50.1);
        mList5.add((float) 10.1);
        mList5.add((float) 34.1);
        mList5.add((float) 17.1);
        mList5.add((float) 104.1);
        mList5.add((float) 113.1);
        mList5.add((float) 116.1);
        mList5.add((float) 105.1);
        mList5.add((float) 166.1);
        mList5.add((float) 130.1);
        mList5.add((float) 110.1);
        mList5.add((float) 104.1);
        mList5.add((float) 110.1);
        mList5.add((float) 140.1);
        mList5.add((float) 110.1);
        mList5.add((float) 140.1);
        mList5.add((float) 55.1);
        mList5.add((float) 55.1);
        mList5.add((float) 55.1);
        mList5.add((float) 55.1);
        mList5.add((float) 55.1);
        mList5.add((float) 55.1);
        mList5.add((float) 55.1);


        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                iecDfLinearChart.addLine4Data(mList5, 200, records5);
            }
        });
        Log.d("LogUtil","=====lemon===a====" + (1 % 5));
        Log.d("LogUtil","=====lemon===b====" + (2 % 5));
        Log.d("LogUtil","=====lemon===c====" + (3 % 5));
        Log.d("LogUtil","=====lemon===d====" + (4 % 5));
        Log.d("LogUtil","=====lemon===e====" + (5 % 5));

    }

    private Handler handler = new Handler();

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            float tv = new Random().nextFloat() * 100 + 20;
            showData(tv);
            updateRateMonitor();

            handler.postDelayed(this, 2000);
        }
    };

    private void updateRateMonitor() {
        double dtok = new Random().nextDouble() * 50 + 10;

        ParamPoint data = new ParamPoint();
        data.put("speed", dtok);
    }

    /**
     * 停止速率监控
     */
    private void stopRateMonitor() {
        handler.removeCallbacks(runnable);
    }



    private void setData(int count, float range) {

        ArrayList<PieEntry> entries = new ArrayList<>();

        ArrayList<Integer> colors = new ArrayList<>();

        for (int i = 0; i < count; i++) {
            entries.add(new PieEntry((float) (Math.random() * range) + range / 5, parties[i % parties.length]));

        }

        PieDataSet dataSet = new PieDataSet(entries, " ");

        // add a lot of colors
        colors.add(Color.parseColor("#03DAC5"));
        colors.add(Color.parseColor("#ff007AFF"));
        colors.add(Color.parseColor("#ffFF6700"));
        colors.add(Color.parseColor("#ffEA4AFF"));
        colors.add(Color.parseColor("#ffE5F2FF"));


        dataSet.setColors(colors);
        //dataSet.setSelectionShift(0f);

        dataSet.setValueLinePart1OffsetPercentage(80.f);
        dataSet.setValueLinePart1Length(0.4f);
        dataSet.setValueLinePart2Length(0.9f);


        dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);

        PieData data = new PieData(dataSet);
        data.setValueFormatter(new PercentFormatter());
        data.setValueTextSize(11f);
        data.setValueTextColor(Color.BLACK);
        data.setValueTypeface(tf);
        chart.setData(data);

        // undo all highlights
        chart.highlightValues(null);

        chart.invalidate();



    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopRateMonitor();
    }

    private void showData(float tv ) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                okLinearChart.addLine1Data(tv, line_cdf, 200);
            }
        });

    }
}

7、layout_linear_mark布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/shape_square"
    android:orientation="vertical"
    android:paddingLeft="@dimen/dp_15"
    android:paddingTop="@dimen/dp_9"
    android:paddingRight="@dimen/dp_25"
    android:paddingBottom="@dimen/dp_10">

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="湘A2345    45km"
        android:textColor="@color/chart_green"
        android:textSize="@dimen/sp_12" />

    <TextView
        android:id="@+id/tv_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="湘CD654    85km"
        android:textColor="@color/chart_yellow"
        android:textSize="@dimen/sp_12" />

    <TextView
        android:id="@+id/tv_three"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="湘D3245    75km"
        android:textColor="@color/chart_blue"
        android:textSize="@dimen/sp_12" />

    <TextView
        android:id="@+id/tv_four"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="湘D3245    95km"
        android:textColor="@color/chart_red"
        android:textSize="@dimen/sp_12" />

    <TextView
        android:id="@+id/tv_five"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="湘U3245    95km"
        android:textColor="@color/chart_violet"
        android:textSize="@dimen/sp_12" />

</LinearLayout>

8、shape_square形状

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp" />
    <stroke
        android:width="1px"
        android:color="@color/transparent_gray" />
    <solid android:color="@color/transparent_gray" />
    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />
</shape>

9、DataRecord对象


public class DataRecord {

    private String vinM;
    private String color;
    private int id;

    private String kmData;
    private String catNumber;

    public String getCatNumber() {
        return catNumber;
    }

    public void setCatNumber(String catNumber) {
        this.catNumber = catNumber;
    }

    public String getKmData() {
        return kmData;
    }

    public void setKmData(String kmData) {
        this.kmData = kmData;
    }

    public String getVinM() {
        return vinM;
    }

    public void setVinM(String vinM) {
        this.vinM = vinM;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "DataRecord{" +
                "vinM='" + vinM + '\'' +
                ", color='" + color + '\'' +
                ", id=" + id +
                ", kmData='" + kmData + '\'' +
                ", catNumber='" + catNumber + '\'' +
                '}';
    }

}

案例下载地址

https://download.csdn.net/download/shi450561200/87418849

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值