Android 图表开源框架之MPAndroidChart LineChart折线图(一)

Android 图表开源框架之MPAndroidChart LineChart折线图(二)

Android 图表开源框架之MPAndroidChart LineChart折线图(三)

Android 图表开源框架之MPAndroidChart LineChart折线图(四)动态添加数据

Android 图表开源框架之MPAndroidChart PieChart扇形图(一)

Android 图表开源框架之MPAndroidChart PieChart扇形图(二)

Android 图表开源框架之MPAndroidChart LineChart之常用自定义设置功能

android折线图 jar包 android 折线图控件_android

一.快速实现:

1.添加依赖:

app build.gradle文件:

implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
packagingOptions {
        exclude 'META-INF/proguard/androidx-annotations.pro'
    }

 

最外层build.gradle文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2.主函数逻辑:

private LineChart lineChart;
    float datas[] = {14f,15f,16f,17f,16f,16f};
    float datas2[] = {17f,16f,15f,14f,17f,14f};
    final String weeks[] = {"昨天","今天","明天","周五","周六","周日"};
    //在MPAndroidChart一般都是通过List<Entry>对象来装数据的
    final List<Entry> entries = new ArrayList<Entry>(); 

 lineChart = (LineChart) findViewById(R.id.lineChart);

 setThreeMpChart();

 /**
     * 3.1.0版本使用
     */
    public void setThreeMpChart(){
        //循环取出数据
        for(int i = 0; i < datas.length; i++){
            entries.add(new Entry(i,datas[i]));
        }
        Description description = new Description();//描述信息
        description.setEnabled(false);//是否可用
        lineChart.setDescription(description);//不然会显示默认的 Description。
        lineChart.setTouchEnabled(true); // 设置是否可以触摸
        lineChart.setDragEnabled(true);// 是否可以拖拽
        lineChart.setScaleEnabled(true);// 是否可以缩放
        lineChart.setPinchZoom(true);//y轴的值是否跟随图表变换缩放;如果禁止,y轴的值会跟随图表变换缩放
        lineChart.setDoubleTapToZoomEnabled(false);//是否允许双击进行缩放
        lineChart.setScaleXEnabled(true);//是否允许以X轴缩放
        lineChart.setDrawGridBackground(false);// 是否显示表格颜色
        lineChart.setGridBackgroundColor(Color.TRANSPARENT);// 表格的的颜色
        lineChart.animateY(1000, Easing.Linear);//设置动画
        lineChart.setExtraBottomOffset(5f);//防止底部数据显示不完整,设置底部偏移量
        lineChart.setExtraRightOffset(45f);//防止右侧数据显示不完整,设置底部偏移量

//x轴配置
        XAxis xAxis = lineChart.getXAxis();
        xAxis.setEnabled(true);//是否可用
        xAxis.setDrawLabels(true);//是否显示数值
        xAxis.setDrawAxisLine(true);//是否显示坐标线
        xAxis.setAxisLineColor(Color.BLACK);//设置坐标轴线的颜色
        xAxis.setAxisLineWidth(0.8f);//设置坐标轴线的宽度
        xAxis.setDrawGridLines(false);//是否显示竖直风格线
        xAxis.setTextColor(Color.BLACK);//X轴文字颜色
//        xAxis.setTextSize(12f);//X轴文字大小
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//X轴文字显示位置
        xAxis.setSpaceMin(1f);//左空白区大小
        xAxis.setSpaceMax(1f);//右空白区大小
        xAxis.setGranularity(1);//间隔1
        //设置X轴坐标自定义数据格式
        xAxis.setValueFormatter(new IndexAxisValueFormatter(){
            @Override
            public String getFormattedValue(float value) {
                //设置当前时间

                int IValue = (int) value;
                int a =(entries.size() - IValue);
//                CharSequence format = DateFormat.format("MM/dd",
//                        System.currentTimeMillis() - (long) (entries.size() - IValue) * 24 * 60 * 60 * 1000);
//                return format.toString();
//                return super.getFormattedValue(value);
                //自定义样式 IAxisValueFormatter  星期
                //防止数组越界判断范围
                if (IValue < 0 || IValue >= weeks.length) {
                    return "";
                } else {
                    return weeks[IValue];
                }
            }
        });
        xAxis.setGranularity(1);//间隔1
//左y轴配置
        YAxis lyAxis = lineChart.getAxisLeft();
        lyAxis.setEnabled(true);//是否可用
        lyAxis.setDrawLabels(true);//是否显示数值
        lyAxis.setDrawAxisLine(true);//是否显示坐标线
        lyAxis.setDrawGridLines(false);//是否显示水平网格线
        lyAxis.setDrawZeroLine(true);是否绘制零线
        lyAxis.setZeroLineColor(Color.BLACK);
//        lyAxis.setZeroLineWidth(0.8f);
//        lyAxis.enableGridDashedLine(10f, 10f, 0f);//网格虚线
        lyAxis.setGridColor(Color.BLACK);//网格线颜色
        lyAxis.setGridLineWidth(0.8f);//网格线宽度
        lyAxis.setAxisLineColor(Color.BLACK);//坐标线颜色
        lyAxis.setTextColor(Color.BLACK);//左侧文字颜色
        lyAxis.setTextSize(12f);//左侧文字大小
//右y轴配置
        YAxis ryAxis = lineChart.getAxisRight();
        ryAxis.setEnabled(true);//是否可用
        // 不显示y轴右边的值
        ryAxis.setEnabled(false);
        ryAxis.setDrawAxisLine(true);
        ryAxis.setDrawZeroLine(true);
//        ryAxis.setZeroLineWidth(1f);
        ryAxis.setAxisLineWidth(0.8f);//设置右侧边界线宽度
        ryAxis.setAxisLineColor(Color.BLACK);

        //X轴左侧数据设置
//        YAxis axisLeft = lineChart.getAxisLeft();
//        axisLeft.setEnabled(true);//是否可用
//        // 不显示y轴左边的值
//        axisLeft.setEnabled(true);
//        axisLeft.setDrawAxisLine(true);
//        axisLeft.setDrawZeroLine(true);
        ryAxis.setZeroLineWidth(1f);
//        axisLeft.setAxisLineWidth(1);//设置左侧边界线宽度
//        axisLeft.setAxisLineColor(Color.BLACK);

//标签配置
        Legend legend = lineChart.getLegend();
        legend.setEnabled(true);//是否可用

        //x轴和y轴的数据


        //循环取出数据
//        for(int i = 0; i < datas2.length; i++){
//            entries.add(new Entry(i,datas2[i]));
//        }
//        YourData[] dataObjects = ...;
//        List<Entry> entries = new ArrayList<Entry>();
//        for (YourData data : dataObjects) {
//            entries.add(new Entry(data.getValueX(), data.getValueY()));
//        }
        LimitLine limitLineL = new LimitLine(15f, "临界点");//临界点
        limitLineL.setLineColor(Color.RED);
        limitLineL.setLineWidth(1.5f);
        limitLineL.setTextSize(10f);
        limitLineL.setTextColor(Color.RED);
        limitLineL.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP);//标签位置
        limitLineL.enableDashedLine(5f,8f,0);  //设置虚线
        lineChart.getAxisLeft().addLimitLine(limitLineL);

        LimitLine limitLine2 = new LimitLine(14.5f, "SD");//临界点
        limitLine2.setLineColor(Color.RED);
        limitLine2.setLineWidth(1.5f);
        limitLine2.setTextSize(10f);
        limitLine2.setTextColor(Color.RED);
        limitLine2.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP);//标签位置
        limitLine2.enableDashedLine(5f,8f,0);  //设置虚线
        lineChart.getAxisLeft().addLimitLine(limitLine2);


        //折线图点的标记
        MyMarkerView mv = new MyMarkerView(this);
        lineChart.setMarker(mv);
        LineDataSet dataSet = new LineDataSet(entries, "Label"); // 添加数据
        // 自定义各种数据样式(不设置则使用默认值)
//        dataSet.setColor(...);
//        dataSet.setValueTextColor(...);
        LineData lineData = new LineData(dataSet);
        //多个折线时使用
//        LineDataSet lineDataSet = new LineDataSet(entries,"ONE");
//        LineDataSet lineDataSet2 = new LineDataSet(entries,"TWO");
//        //保存LineDataSet集合
//        ArrayList<ILineDataSet> dataSets = new ArrayList<>();
//        dataSets.add(lineDataSet); // add the datasets
//        dataSets.add(lineDataSet2); // add the datasets
//        LineData lineDataLists = new LineData(dataSets);//添加多个折线集合

//        dataSet.setColor(Color.RED);//设置折线的颜色
        dataSet.setCircleSize(5f);// 显示的圆形大小
        dataSet.setCircleColor(Color.RED);//设置圆点的颜色
        //设置曲线值的圆点是实心还是空心
        dataSet.setDrawCircleHole(true);
        dataSet.setDrawFilled(true);//设置不画数据覆盖的阴影层
//        dataSet.setDrawValues(false);//不绘制线的数据
//        dataSet.setLineWidth(2f);//设置折线宽度
//        dataSet.setCircleRadius(6f);
        // 填充曲线下方的区域,红色,半透明。
        dataSet.setDrawFilled(true);
        dataSet.setFillAlpha(65);
//        dataSet.setFillColor(Color.WHITE);
//        dataSet.setDrawCircleHole(false);
        dataSet.setDrawCircles(true);//是否显示圆心
        dataSet.setValueTextColor(Color.rgb(89, 194, 230)); //数值显示的颜色
        dataSet.setValueTextSize(8f);     //数值显示的大小
        // 设置平滑曲线
//        dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        lineChart.setData(lineData);
//        lineChart.animateX(2000);
        lineChart.invalidate(); // 刷新
//        Matrix m = new Matrix();
//        m.postScale(1, 1f);//两个参数分别是x,y轴的缩放比例。例如:将x轴的数据放大为之前的1.5倍,《这个地方是在设置能滑动的时候编辑的,假如X轴最多展示5条但是呢有10条数据,那么这里就是2,1》
        lineChart.getViewPortHandler().refresh(new Matrix(),lineChart,true);//将图表动画显示之前进行缩放
    }
    /**
//     * 更新图表
//     *
//     * @param chart   图表
//     * @param values  数据
//     * @param valueType 数据类型
//     */
//    public static void notifyDataSetChanged(LineChart chart, List<Entry> values,
//                                            final int valueType) {
//        chart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
//            @Override
//            public String getFormattedValue(float value, AxisBase axis) {
//                return weeks(valueType)[(int) value];
//            }
//        });
//
//        chart.invalidate();
        setChartData(chart, values);
//    }
<com.github.mikephil.charting.charts.LineChart
            android:id="@+id/lineChart"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:padding="10dp" />

 

 3.自定义MarkerView显示视图:

import android.content.Context;
import android.text.format.DateFormat;
import android.widget.TextView;

import com.github.mikephil.charting.components.MarkerView;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.utils.MPPointF;

import java.text.DecimalFormat;

public class MyMarkerView extends MarkerView
{

    private TextView tvContent;
    private DecimalFormat format = new DecimalFormat("##0");

    public MyMarkerView(Context context) {
        super(context, R.layout.layout_markerview);//这个布局自己定义
        tvContent = (TextView) findViewById(R.id.tvContent);
    }

    //显示的内容
    @Override
    public void refreshContent(Entry e, Highlight highlight) {
//        tvContent.setText(format(e.getX())+"\n"+format.format(e.getY())+"辆");
        tvContent.setText(format.format(e.getY())+"辆");
        super.refreshContent(e, highlight);
    }

    //标记相对于折线图的偏移量
    @Override
    public MPPointF getOffset() {
        return new MPPointF(-(getWidth() / 2), -getHeight());
    }

    //时间格式化(显示今日往前30天的每一天日期)
    public String  format(float x)
    {
        CharSequence format = DateFormat.format("MM月dd日",
                System.currentTimeMillis()-(long) (30-(int)x)*24*60*60*1000);
        return format.toString();
    }
}

 4.MarkerView布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:background="@drawable/bg_shape_c"
        android:layout_width="match_parent"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingTop="6dp"
        android:paddingBottom="6dp"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tvContent"
            android:text="KING"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>

5.背景色:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#fff" />
    <corners
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp" />
    <stroke android:width="1dp" android:color="@color/colorPrimaryDark"></stroke>
</shape>
<color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="transparent_gray_light">#89000000</color>
    <color name="white">#fff</color>
    <color name="split_line2">#333</color>
    <color name="divider">#ffd2d2d2</color>

    <color name="light_green_900">#33691E</color>
    <color name="purple_500">#9C27B0</color>
    <color name="pink_500">#FF4081</color>
    <color name="orange_500">#FF9800</color>
    <color name="cyan_500">#00BCD4</color>
    <color name="yellow_900">#F57F17</color>


    <color name="item_bg">#454545</color>
    <color name="item_bg_pressed">#707070</color>

    <color name="green">#00ff00</color>
    <color name="dark">#FF222222</color>
    <color name="light">#FFEEEEEE</color>