MPAndroidChart开源图表《总》之折线图、统计图、扇形图

MPAndroidChart简介

    MPAndroidChart是一款基于Android的开源图表库,MPAndroidChart不仅可以在Android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活。和前面介绍的AChartEngine相比,MPAndroidChart显得更为轻巧和简单,MPAndroidChart同样拥有常用的图表类型:线型图、饼图、柱状图和散点图。

效果图:有图有真相

我这里也用官方的先给你们看看吧,走一走套路式
LineChart 折线图
     

     

     
    BarChart 条形图
    
PieChart 扇形图
    

真相,有图有真相

    电脑有点卡,导致录制的动画很卡,你可以运行到手机上看看真正的效果
    


1.从上面的地址中下载最新mpandroidchartlibrary-2-0-8.jar包, 然后copy到项目的libs中,然后就可以开始实现了

一、源码演示:LineChart 折线图

1.xml布局
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <com.github.mikephil.charting.charts.LineChart  
  8.         android:id="@+id/lineChart"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent" />  
  11.   
  12.   
  13. </LinearLayout></span>  
2.当点击折线图的点的时候显示所需要的view和布局
  1. <span style="font-size:14px;">package com.test.demo.demo.widget;  
  2.   
  3. import android.content.Context;  
  4. import android.widget.TextView;  
  5.   
  6. import com.github.mikephil.charting.components.MarkerView;  
  7. import com.github.mikephil.charting.data.CandleEntry;  
  8. import com.github.mikephil.charting.data.Entry;  
  9. import com.github.mikephil.charting.highlight.Highlight;  
  10. import com.github.mikephil.charting.utils.Utils;  
  11. import com.test.demo.demo.R;  
  12. import com.test.demo.demo.utils.UnitUtils;  
  13.   
  14. /** 
  15.  * 作者:zengtao 
  16.  * 邮箱:1039562669@qq.com 
  17.  * 时间:2015/10/13 0013 19:08 
  18.  */  
  19. public class MyMarkView extends MarkerView {  
  20.     private TextView tvMarkText;  
  21.   
  22.     public MyMarkView(Context context) {  
  23.         super(context, R.layout.mark_view);  
  24.         tvMarkText = (TextView) findViewById(R.id.tvMarkText);  
  25.     }  
  26.   
  27.     @Override  
  28.     public void refreshContent(Entry entry, Highlight highlight) {  
  29.         if (entry instanceof CandleEntry) {  
  30.             CandleEntry ce = (CandleEntry) entry;  
  31.             tvMarkText.setText("" + Utils.formatNumber(ce.getHigh(), 0true));  
  32.         } else {  
  33.             tvMarkText.setText("" + entry.getVal());  
  34.         }  
  35.     }  
  36.   
  37.     @Override  
  38.     public int getXOffset() {  
  39.         return -(getWidth() / 2);  
  40.     }  
  41.   
  42.     @Override  
  43.     public int getYOffset() {  
  44.         return -getHeight() - UnitUtils.dp2px(getContext(), 2);  
  45.     }  
  46. }</span>  
布局
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <TextView  
  8.         android:id="@+id/tvMarkText"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_gravity="center"  
  12.         android:background="@drawable/bg_marker"  
  13.         android:padding="10dp"  
  14.         android:textSize="18dp" />  
  15.   
  16.   
  17. </LinearLayout></span>  
源码演示:
  1. <span style="font-size:14px;">package com.test.demo.demo;  
  2.   
  3. import android.graphics.Color;  
  4. import android.os.Bundle;  
  5. import android.support.v7.app.AppCompatActivity;  
  6.   
  7. import com.github.mikephil.charting.charts.LineChart;  
  8. import com.github.mikephil.charting.components.Legend;  
  9. import com.github.mikephil.charting.data.Entry;  
  10. import com.github.mikephil.charting.data.LineData;  
  11. import com.github.mikephil.charting.data.LineDataSet;  
  12. import com.test.demo.demo.widget.MyMarkView;  
  13.   
  14. import java.util.ArrayList;  
  15.   
  16. import butterknife.ButterKnife;  
  17. import butterknife.InjectView;  
  18.   
  19. /** 
  20.  * 作者:zengtao 
  21.  * 邮箱:1039562669@qq.com 
  22.  * 时间:2015/10/13 0013 20:01 
  23.  */  
  24. public class LineChartActivity extends AppCompatActivity {  
  25.   
  26.     @InjectView(R.id.lineChart)  
  27.     LineChart mChart;  
  28.   
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_line_chart);  
  33.         ButterKnife.inject(this);  
  34.         initChart();  
  35.     }  
  36.   
  37.     /** 
  38.      * 1.初始化LineChart 
  39.      * 2.添加数据x,y轴数据 
  40.      * 3.刷新图表 
  41.      */  
  42.     private void initChart() {  
  43.         /** 
  44.          * ====================1.初始化-自由配置=========================== 
  45.          */  
  46.         // 是否在折线图上添加边框  
  47.         mChart.setDrawGridBackground(false);  
  48.         mChart.setDrawBorders(false);  
  49.         // 设置右下角描述  
  50.         mChart.setDescription("");  
  51.         //设置透明度  
  52.         mChart.setAlpha(0.8f);  
  53.         //设置网格底下的那条线的颜色  
  54.         mChart.setBorderColor(Color.rgb(213216214));  
  55.         //设置高亮显示  
  56.         mChart.setHighlightEnabled(true);  
  57.         //设置是否可以触摸,如为false,则不能拖动,缩放等  
  58.         mChart.setTouchEnabled(true);  
  59.         //设置是否可以拖拽  
  60.         mChart.setDragEnabled(false);  
  61.         //设置是否可以缩放  
  62.         mChart.setScaleEnabled(false);  
  63.         //设置是否能扩大扩小  
  64.         mChart.setPinchZoom(false);  
  65.         /** 
  66.          * ====================2.布局点添加数据-自由布局=========================== 
  67.          */  
  68.         // 折线图的点,点击战士的布局和数据  
  69.         MyMarkView mv = new MyMarkView(this);  
  70.         mChart.setMarkerView(mv);  
  71.         // 加载数据  
  72.         LineData data = getLineData();  
  73.         mChart.setData(data);  
  74.         /** 
  75.          * ====================3.x,y动画效果和刷新图表等=========================== 
  76.          */  
  77.         //从X轴进入的动画  
  78.         mChart.animateX(4000);  
  79.         mChart.animateY(3000);   //从Y轴进入的动画  
  80.         mChart.animateXY(30003000);    //从XY轴一起进入的动画  
  81.         //设置最小的缩放  
  82.         mChart.setScaleMinima(0.5f, 1f);  
  83.         Legend l = mChart.getLegend();  
  84.         l.setForm(Legend.LegendForm.LINE);  //设置图最下面显示的类型  
  85.         l.setTextSize(15);  
  86.         l.setTextColor(Color.rgb(104241175));  
  87.         l.setFormSize(30f);  
  88.         // 刷新图表  
  89.         mChart.invalidate();  
  90.     }  
  91.   
  92.     private LineData getLineData() {  
  93.         String[] xx = {"2""4""6""8""10""12""14""16""18"};  
  94.         String[] yy = {"20""80""10""60""30""70""55""22""40"};  
  95.   
  96.         ArrayList<String> xVals = new ArrayList<String>();  
  97.         for (int i = 0; i < xx.length; i++) {  
  98.             xVals.add(xx[i]);  
  99.         }  
  100.   
  101.         ArrayList<Entry> yVals = new ArrayList<Entry>();  
  102.         for (int i = 0; i < yy.length; i++) {  
  103.             yVals.add(new Entry(Float.parseFloat(yy[i]), i));  
  104.         }  
  105.   
  106.         LineDataSet set1 = new LineDataSet(yVals, "LineChart Test");  
  107.         set1.setDrawCubic(true);  //设置曲线为圆滑的线  
  108.         set1.setCubicIntensity(0.2f);  
  109.         set1.setDrawFilled(false);  //设置包括的范围区域填充颜色  
  110.         set1.setDrawCircles(true);  //设置有圆点  
  111.         set1.setLineWidth(2f);    //设置线的宽度  
  112.         set1.setCircleSize(5f);   //设置小圆的大小  
  113.         set1.setHighLightColor(Color.rgb(244117117));  
  114.         set1.setColor(Color.rgb(104241175));    //设置曲线的颜色  
  115.   
  116.         return new LineData(xVals, set1);  
  117.     }  
  118. }  
  119. </span>  
以上,就完成了一个折线图的打造,其实也就很简单,就三点

1.初始化
2.添加数据x,y轴数据
3.出现动画和刷新图表


二、源码演示:BarChart 折线图

布局:
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <com.github.mikephil.charting.charts.BarChart  
  8.         android:id="@+id/barChart"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent">  
  11.   
  12.     </com.github.mikephil.charting.charts.BarChart>  
  13.   
  14. </LinearLayout></span>  
示例:
  1. <span style="font-size:14px;">package com.test.demo.demo;  
  2.   
  3. import android.graphics.Color;  
  4. import android.os.Bundle;  
  5. import android.support.v7.app.AppCompatActivity;  
  6.   
  7. import com.github.mikephil.charting.charts.BarChart;  
  8. import com.github.mikephil.charting.components.Legend;  
  9. import com.github.mikephil.charting.data.BarData;  
  10. import com.github.mikephil.charting.data.BarDataSet;  
  11. import com.github.mikephil.charting.data.BarEntry;  
  12.   
  13. import java.util.ArrayList;  
  14.   
  15. import butterknife.ButterKnife;  
  16. import butterknife.InjectView;  
  17.   
  18. /** 
  19.  * 作者:zengtao 
  20.  * 邮箱:1039562669@qq.com 
  21.  * 时间:2015/10/14 0014 10:05 
  22.  */  
  23. public class BarChartActivity extends AppCompatActivity {  
  24.     @InjectView(R.id.barChart)  
  25.     BarChart barChart;  
  26.   
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.activity_bar_chart);  
  31.         ButterKnife.inject(this);  
  32.         initBarChart();  
  33.     }  
  34.   
  35.     private void initBarChart() {  
  36.         barChart.setDrawGridBackground(false);  
  37.         barChart.setDrawBorders(false);  //是否在折线图上添加边框  
  38.         barChart.setDescription("");// 数据描述  
  39.         barChart.setNoDataTextDescription("no data to display"); // 如果没有数据,显示  
  40.         barChart.setDrawGridBackground(false); // 是否显示表格颜色  
  41.         barChart.setGridBackgroundColor(Color.WHITE); // 表格的的颜色,在这里是是给颜色设置一个透明度  
  42.   
  43.         barChart.setTouchEnabled(false); // 设置是否可以触摸  
  44.         barChart.setDragEnabled(false);// 是否可以拖拽  
  45.         barChart.setScaleEnabled(false);// 是否可以缩放  
  46.         barChart.setPinchZoom(false);//  
  47.         barChart.setDrawBarShadow(true);  
  48.   
  49.         // 设置数据  
  50.         BarData mBarData = getBarData(4);  
  51.         barChart.setData(mBarData);  
  52.   
  53.         Legend mLegend = barChart.getLegend(); // 设置比例图标示  
  54.         mLegend.setForm(Legend.LegendForm.CIRCLE);// 样式  
  55.         mLegend.setFormSize(6f);// 字体  
  56.         mLegend.setTextColor(Color.BLACK);// 颜色  
  57.   
  58.         // X轴设定  
  59.         barChart.animateY(3000);  
  60.         barChart.invalidate();  
  61.     }  
  62.   
  63.     private BarData getBarData(int count) {  
  64.         int[] yy = {60408050};  
  65.   
  66.         ArrayList<String> xValues = new ArrayList<String>();  
  67.         for (int i = 0; i < count; i++) {  
  68.             xValues.add(String.format("爱情公寓%s", (i + 1)));  
  69.         }  
  70.   
  71.         ArrayList<BarEntry> yValues = new ArrayList<BarEntry>();  
  72.         for (int i = 0; i < count; i++) {  
  73.             yValues.add(new BarEntry(yy[i], i));  
  74.         }  
  75.   
  76.         // y轴的数据集合  
  77.         BarDataSet barDataSet = new BarDataSet(yValues, "BarChart Test");  
  78.         barDataSet.setColor(Color.rgb(114188223));  
  79.         ArrayList<BarDataSet> barDataSets = new ArrayList<BarDataSet>();  
  80.         barDataSets.add(barDataSet); // add the datasets  
  81.         BarData barData = new BarData(xValues, barDataSets);  
  82.         return barData;  
  83.     }  
  84. }  
  85. </span>  
看到这里,你就会发现,折线图和统计图,基本上都是一个样子:

1.初始化
2.添加数据x,y轴数据
3.出现动画和刷新图表

同样的操作,连初始化都是差不多,所以,你只需要懂一个的统计图,那么所有的就都懂了,多的不说,往下看

三、源码演示:PieChart 扇形图

布局:
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <com.github.mikephil.charting.charts.PieChart  
  8.         android:id="@+id/pieChart"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent" />  
  11.       
  12. </LinearLayout></span>  
示例:
  1. <span style="font-size:14px;">package com.test.demo.demo;  
  2.   
  3. import android.graphics.Color;  
  4. import android.os.Bundle;  
  5. import android.support.v7.app.AppCompatActivity;  
  6. import android.util.DisplayMetrics;  
  7.   
  8. import com.github.mikephil.charting.charts.PieChart;  
  9. import com.github.mikephil.charting.components.Legend;  
  10. import com.github.mikephil.charting.data.Entry;  
  11. import com.github.mikephil.charting.data.PieData;  
  12. import com.github.mikephil.charting.data.PieDataSet;  
  13.   
  14. import java.util.ArrayList;  
  15.   
  16. import butterknife.ButterKnife;  
  17. import butterknife.InjectView;  
  18.   
  19. /** 
  20.  * 作者:zengtao 
  21.  * 邮箱:1039562669@qq.com 
  22.  * 时间:2015/10/14 0014 10:05 
  23.  */  
  24. public class PieChartActivity extends AppCompatActivity {  
  25.     @InjectView(R.id.pieChart)  
  26.     PieChart pieChart;  
  27.   
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_pie_chart);  
  32.         ButterKnife.inject(this);  
  33.         initPieChart();  
  34.     }  
  35.   
  36.     private void initPieChart() {  
  37.         pieChart.setDescription("BarChart Test");  
  38.         pieChart.setHoleColorTransparent(true);  
  39.         pieChart.setHoleRadius(60f);  //半径  
  40.         pieChart.setTransparentCircleRadius(0f); // 半透明圈  
  41.         pieChart.setHoleRadius(0);  //实心圆  
  42.   
  43.         pieChart.setDrawCenterText(true);  //饼状图中间可以添加文字  
  44.         pieChart.setDrawHoleEnabled(true);  
  45.         pieChart.setRotationAngle(90); // 初始旋转角度  
  46.   
  47.         pieChart.setRotationEnabled(true); // 可以手动旋转  
  48.         pieChart.setUsePercentValues(true);  //显示成百分比  
  49. //        pieChart.setCenterText("PieChart");  //饼状图中间的文字  
  50.   
  51.         //设置数据  
  52.         PieData pieData = getPieData(6);  
  53.         pieChart.setData(pieData);  
  54.   
  55.         Legend mLegend = pieChart.getLegend();  //设置比例图  
  56.         mLegend.setPosition(Legend.LegendPosition.LEFT_OF_CHART_CENTER);  //最左边显示  
  57.         mLegend.setForm(Legend.LegendForm.SQUARE);  //设置比例图的形状,默认是方形 SQUARE  
  58.         mLegend.setXEntrySpace(7f);  
  59.         mLegend.setYEntrySpace(5f);  
  60.   
  61.         pieChart.animateXY(10001000);  //设置动画  
  62.         pieChart.invalidate();  
  63.     }  
  64.   
  65.     private PieData getPieData(int count) {  
  66.         int[] yy = {121218202810};  
  67.   
  68.         ArrayList<String> xValues = new ArrayList<String>();  //xVals用来表示每个饼块上的内容  
  69.         for (int i = 0; i < count; i++) {  
  70.             xValues.add("PieChart" + (i + 1));  //饼块上显示成PieChart1, PieChart2, PieChart3, PieChart4,PieChart5,PieChart6  
  71.         }  
  72.   
  73.         /** 
  74.          * 将一个饼形图分成六部分, 各个部分的数值比例为12:12:18:20:28:10 
  75.          * 所以 12代表的百分比就是12% 
  76.          * 在具体的实现过程中,这里是获取网络请求的list的数据 
  77.          */  
  78.         ArrayList<Entry> yValues = new ArrayList<Entry>();  //yVals用来表示封装每个饼块的实际数据  
  79.         for (int i = 0; i < count; i++) {  
  80.             yValues.add(new Entry(yy[i], i));  
  81.         }  
  82.   
  83.         //y轴的集合  
  84.         PieDataSet pieDataSet = new PieDataSet(yValues, "PieChart Revenue 2014");  
  85.         pieDataSet.setSliceSpace(0f); //设置个饼状图之间的距离  
  86.   
  87.         // 饼图颜色  
  88.         ArrayList<Integer> colors = new ArrayList<Integer>();  
  89.         colors.add(Color.rgb(205205205));  
  90.         colors.add(Color.rgb(114188223));  
  91.         colors.add(Color.rgb(255123124));  
  92.         colors.add(Color.rgb(57135200));  
  93.         colors.add(Color.rgb(3020200));  
  94.         colors.add(Color.rgb(8060150));  
  95.         pieDataSet.setColors(colors);  
  96.   
  97.         DisplayMetrics metrics = getResources().getDisplayMetrics();  
  98.         float px = 5 * (metrics.densityDpi / 160f);  
  99.         pieDataSet.setSelectionShift(px); // 选中态多出的长度  
  100.         PieData pieData = new PieData(xValues, pieDataSet);  
  101.   
  102.         return pieData;  
  103.     }  
  104. }  
  105. </span>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值