MPAndroidChart入门

因为最近的项目中有多个地方使用到图表,而之前没有使用过,所以在网上找相关的图表开源库,有两个是最流行的;一个是MPAndroidChart,另一个是hello-chart,最后经过考虑决定使用前者,所以下载了官方的Demo,并写了此篇文章来加深对该库的使用流程。
第一步:根据官方说明添加依赖
app依赖

dependencies {
    compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
}

库文件依赖

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

第二步:在布局文件中添加一个LineChart

<com.github.mikephil.charting.charts.LineChart
        android:id="@+id/lineChart"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

第三步:初始化该Chart,以及相关数据的设置

//初始化以及相关监听器的设置
mLineChart = (LineChart) findViewById(R.id.lineChart);
mLineChart.setLogEnabled(true);  //设置日志打印功能
mLineChart.setOnChartGestureListener(this);
mLineChart.setOnChartValueSelectedListener(this);

mLineChart.setTouchEnabled(true);   //设置可触摸
mLineChart.setDragEnabled(true);    //设置可缩放
mLineChart.setPinchZoom(true);      //设置中心缩放

mLineChart.setScaleEnabled(true);   //设置可拖拉
//mLineChart.setScaleXEnabled(true);
//mLineChart.setScaleYEnabled(true);

//设置图表背景,以及没数据展示时相关设置
mLineChart.setBackgroundColor(Color.GRAY); 
mLineChart.setBackgroundColor(Color.GRAY);
mLineChart.setNoDataText("没有数据展示");
mLineChart.setNoDataTextColor(Color.RED);
mLineChart.setNoDataTextTypeface(Typeface.createFromAsset(getAssets(),"OpenSans-Light.ttf"));

//设置图标的表述及相关属性
Description description = mLineChart.getDescription();
description.setText("我的第一个图标标题");
description.setTextColor(Color.RED);
description.setPosition(1050,80);
description.setTypeface(Typeface.createFromAsset(getAssets(),"OpenSans-Light.ttf"));
description.setTextSize(12f);

//背景矩形区域绘制设置
mLineChart.setDrawGridBackground(true);
mLineChart.setGridBackgroundColor(Color.BLUE);

//边界设置
mLineChart.setDrawBorders(true);
mLineChart.setBorderColor(Color.YELLOW);
mLineChart.setBorderWidth(3f);

//设置LimitLine
LimitLine llXAxis = new LimitLine(0f, "Index 10");  //设置线的位置和标识
llXAxis.setLineWidth(4f); //设置线的宽度
llXAxis.enableDashedLine(10f, 10f, 0f);  //设置虚线
llXAxis.setLineColor(Color.YELLOW);  //设置线的颜色
llXAxis.setLabelPosition(LimitLabelPosition.RIGHT_BOTTOM); //设置标识的位置
llXAxis.setTextSize(20f); //设置字体的大小

//给X轴添加LimitLine
XAxis xAxis = mLineChart.getXAxis();
xAxis.addLimitLine(llXAxis); // add x-axis limit line
xAxis.enableGridDashedLine(10f, 10f, 0f); //设置为虚线
xAxis.setAxisMaximum(100f);    //设置X轴的最大值
xAxis.setAxisMinimum(-50);     //设置X轴的最小值

//给Y轴添加LimitLine
Typeface tf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");

LimitLine ll1 = new LimitLine(150f, "Upper Limit");
ll1.setLineWidth(4f);
ll1.enableDashedLine(10f, 10f, 0f);
ll1.setLabelPosition(LimitLabelPosition.RIGHT_TOP);
ll1.setTextSize(10f);
ll1.setTypeface(tf);

LimitLine ll2 = new LimitLine(-30f, "Lower Limit");
ll2.setLineWidth(4f);
ll2.enableDashedLine(10f, 10f, 0f);
ll2.setLabelPosition(LimitLabelPosition.RIGHT_BOTTOM);
ll2.setTextSize(10f);
ll2.setTypeface(tf);

YAxis leftAxis = mLineChart.getAxisLeft();
leftAxis.removeAllLimitLines(); // reset all limit lines to avoid overlapping lines
leftAxis.addLimitLine(ll1);
leftAxis.addLimitLine(ll2);
leftAxis.setAxisMaximum(200f);
leftAxis.setAxisMinimum(-50f);
//leftAxis.setYOffset(20f);
leftAxis.enableGridDashedLine(10f, 10f, 0f);
leftAxis.setDrawZeroLine(false);

// limit lines are drawn behind data (and not on top)
leftAxis.setDrawLimitLinesBehindData(true);

mLineChart.getAxisRight().setEnabled(false);

//设置数据
setData(int count,float range);

//设置动画和标签的样式
mLineChart.animateX(2500);
Legend l = mChart.getLegend();
l.setForm(LegendForm.CIRCLE);

   / **
     * 设置图表的数据
     * @param count 数据的个数
     * @param range 数据的范围
     */
    private void setData(int count, float range) {

        ArrayList<Entry> values = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            float val = (float) ((Math.random() *range) +3);
            values.add(new Entry(i,val));
        }

        LineDataSet set1;
        if (mLineChart.getData() != null &&
                mLineChart.getData().getDataSetCount() >0){
            set1 = (LineDataSet) mLineChart.getData().getDataSetByIndex(0);
            set1.setValues(values);
            mLineChart.getData().notifyDataChanged();
            mLineChart.notifyDataSetChanged();
        }else {
            set1 = new LineDataSet(values,"网络数据报表");

            set1.enableDashedLine(10f,5f,0f);
            set1.enableDashedHighlightLine(10f,5f,0f);
            set1.setCircleColor(Color.BLUE);
            set1.setCircleColor(Color.GREEN);
            set1.setLineWidth(1f);
            set1.setCircleRadius(3f);
            set1.setDrawCircleHole(true);
            set1.setValueTextSize(9f);
            set1.setDrawFilled(true);
            set1.setFormLineWidth(1f);
            set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f,5f},0f));
            set1.setFormSize(15.f);

            /*if (VERSION.SDK_INT >= 18){
                Drawable drawable = ContextCompat.getDrawable(this,R.drawable.fade_red);
                set1.setFillDrawable(drawable);
            }else {
                set1.setFillColor(Color.BLACK);
            }*/

            ArrayList<ILineDataSet> dataSets = new ArrayList<>();
            dataSets.add(set1);

            LineData data = new LineData(dataSets);

            mLineChart.setData(data);
        }
    }

数据改变后刷新数据:

mLineChart.invalidate();  //重新绘制

设置曲线值得显示:

List<ILineDataSet> sets = mLineChart.getData().getDataSets();
for (ILineDataSet iSet : sets) {
    LineDataSet set = (LineDataSet) iSet;
    set.setDrawValues(!set.isDrawValuesEnabled());
}
mLineChart.invalidate();

设置阴影区域的显示:

List<ILineDataSet> sets = mLineChart.getData().getDataSets();
for (ILineDataSet iSet : sets) {
    LineDataSet set = (LineDataSet) iSet;
    if (set.isDrawFilledEnabled())
        set.setDrawFilled(false);
     else
        set.setDrawFilled(true);
}
mLineChart.invalidate();

设置每个点的值以原点标注:

List<ILineDataSet> sets = mLineChart.getData().getDataSets();
for (ILineDataSet iSet : sets) {
    LineDataSet set = (LineDataSet) iSet;
    if (set.isDrawCirclesEnabled())
        set.setDrawCircles(false);
    else
        set.setDrawCircles(true);
}
mLineChart.invalidate();

设置曲线和折线方式的转换:

List<ILineDataSet> sets = mLineChart.getData().getDataSets();
for (ILineDataSet iSet : sets) {
    LineDataSet set = (LineDataSet) iSet;
    set.setMode(set.getMode() == LineDataSet.Mode.CUBIC_BEZIER ?LineDataSet.Mode.LINEAR:LineDataSet.Mode.CUBIC_BEZIER);
}
mLineChart.invalidate();

保存图表到本地:

mLineChart.saveToPath("title" + System.currentTimeMillis(), "");

绘制多条曲线:

LineData data = new LineData(set1, set2, set3);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值