当前位置:首页 » 《随便一记》 » 正文

MPAndroidChart详解_indeedes的博客

19 人参与  2022年03月04日 13:59  分类 : 《随便一记》  评论

点击全文阅读


简介

MPAndroidChart是一款基于Android的开源图表库,MPAndroidChart不仅可以在Android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活。

基本使用

  • 创建视图
    两种方式
    1. .xml中定义它
    <com.github.mikephil.charting.charts.LineChart
        android:id="@+id/chart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    1. java代码动态创建,并将声明的对象放到视图中
    LineChart chart = new LineChart(Context);
    
  • 添加数据
    想要给图表设置数据,必须通过setData()方法
    public void setData (ChartData data ){ ... }   
    
    ChartData类里面封装了呈现期间所需图表的所有数据和信息,使用每一种图表需要使用其对应的子类
    例如:LineChart对应LineData
    这时你会看到构造函数有以下方法,同时LineData也有addDataSet()方法
    public LineData(List<LineDataSet> sets) { ... }
    public LineData(LineDataSet...) { ... }
    
    一个DataSet对象表示当前Chart的一种类型数据,它可以将Chart中加入不同的类型,其允许特定样式。
    例如:一个折线图,可能不光有当天的温度和湿度变化,还有前几天的变化
    LineDataSet构造函数如下
    public LineDataSet (List <Entry> entries,String label ){ ... }  
    
    List类型的Entry封装了图表的所有值,要向图表添加数据,需要将每个数据对象包装到Entry对象,Entry类表示单个数据
    注意:mpAndroidChart不同版本有一定差异,方法参数会有一定的差异,总体思路基本一致,注意看方法的参数,和异常信息!!!

     更新视图
    使用invalidate()方法刷新数据
    如果是动态添加数据需要notify

lineDataSet.notifyDataSetChanged();
lineData.notifyDataChanged();
lineChart.notifyDataSetChanged();
lineChart.invalidate();

手势交互

  • setTouchEnabled(boolean enabled):允许启用/禁用与图表的所有可能的触摸交互
  • setDragEnabled(boolean enabled):启用/禁用图表的拖动(平移)
  • setScaleEnabled(boolean enabled):启用/禁用两个轴上的图表缩放
  • setScaleXEnabled(boolean enabled):启用/禁用x轴缩放
  • setScaleYEnabled(boolean enabled):启用/禁用y轴缩放
  • setPinchZoom(boolean enabled):如果设置为true,则启用缩放缩放。如果禁用,则可以单独缩放x轴和y轴
  • setDoubleTapToZoomEnabled(boolean enabled):将此设置为false以禁止通过双击来缩放图表

颜色设置

  • 通过DataSet对象的setColor()setColors()设置颜色,也可选择已经提供好的颜色集颜色集合在ColorTemplate类中

    barDataSet.setColors(ColorTemplate.JOYFUL_COLORS);


代码运用

public class DataAnalyseActivity extends AppCompatActivity {
//1 定义对象
     LineChart income_chart,outpay_chart;
     MyDBHelper mhelper;
     SQLiteDatabase db;
     String[] indata={"学习-奖金","补助-奖金","比赛-奖励","业余-兼职","基本工资","福利-分红","加班-津贴","其他"};
     //收入类型数据统计的初始值
     int xxjjmoney=0;
     int bzjjmoney=0;
     int bsjlmoney=0;
     int yyjzmoney=0;
     int jbgzmoney=0;
     int flfhmoney=0;
     int jbjtmoney=0;
     int qtmoney=0;
     String[] outdata={"电影-娱乐","美食-畅饮","欢乐-购物","手机-充值","交通-出行","教育-培训","社交-礼仪","生活-日用","其他"};
     //收入类型数据统计的初始值
     int dyylmoney=0;
     int mscymoney=0;
     int hlgwmoney=0;
     int sjczmoney=0;
     int jtcxmoney=0;
     int jypxmoney=0;
     int sjlymoney=0;
     int shrymoney=0;
     int othermoney=0;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_data_analyse);
         //2 绑定控件
         initView();
         //3 收入汇总分析
         inComeData();
         //4 支出汇总分析
         outComeData();
     }
     //2 绑定控件---------------代码
     private void initView() {
         income_chart=findViewById(R.id.income_chart_data);
         outpay_chart=findViewById(R.id.outpay_chart_data);
         mhelper=new MyDBHelper(DataAnalyseActivity.this);
         db=mhelper.getWritableDatabase();
     }
     //3 收入汇总分析-------------------代码
     private void inComeData() {
         //第一部分:获取数据
         Cursor cursor =db.rawQuery("select * from in_come",null);
         while(cursor.moveToNext()){
             Double mymoney=cursor.getDouble(cursor.getColumnIndex("inmoney"));
             String mytype=cursor.getString(cursor.getColumnIndex("intype"));
             if(mytype.equals("学习-奖金")){
                 xxjjmoney+=mymoney;
             }else if(mytype.equals("补助-奖金")){
                 bzjjmoney+=mymoney;
             }else if(mytype.equals("比赛-奖励")){
                 bzjjmoney+=mymoney;
             }else if(mytype.equals("业余-兼职")){
                 yyjzmoney+=mymoney;
             }else if(mytype.equals("基本-工资")){
                 jbgzmoney+=mymoney;
             }else if(mytype.equals("福利-分红")){
                 flfhmoney+=mymoney;
             }else if(mytype.equals("加班-津贴")){
                 jbjtmoney+=mymoney;
             }else if(mytype.equals("其他")){
                 qtmoney+=mymoney;
             }
         }
         //第二部分:LineChart 图表初始化设置---Xy 轴的设置
             XAxis xAxis=income_chart.getXAxis();//获取此图表的 x 轴轴线
             YAxis yAxisleft =income_chart.getAxisLeft();//获取此图表的 Y 轴左侧轴线
             YAxis yAxisright =income_chart.getAxisRight();//获取此图表的 Y轴右侧轴线
             xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置 X 轴线的位置为底部
             yAxisleft.setAxisMinimum(0f);//保证 Y 轴从 0 开始,不然会上移一点。
             yAxisright.setAxisMinimum(0f);
             xAxis.setValueFormatter(new IAxisValueFormatter() {//x 轴自定义标签的设置
             @Override
             public String getFormattedValue(float v, AxisBase axisBase) {
                 return indata[(int) v];
             }
         });
         //第三部分:LineDataSet 曲线初始化设置
         List<Entry> inentries=new ArrayList<>();//Y 轴的数据
         inentries.add(new Entry(0,xxjjmoney));
         inentries.add(new Entry(1,bzjjmoney));
         inentries.add(new Entry(2,bsjlmoney));
         inentries.add(new Entry(3,yyjzmoney));
         inentries.add(new Entry(4,jbgzmoney));
         inentries.add(new Entry(5,flfhmoney));
         inentries.add(new Entry(6,jbjtmoney));
         inentries.add(new Entry(7,qtmoney));
         LineDataSet lineDataSet=new LineDataSet(inentries,"金额");//代表一条线,“金额”是曲线名称
         lineDataSet.setValueTextSize(25);//曲线上文字的大小
         lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色
         lineDataSet.setDrawFilled(true);//设置折线图填充
         //第四部分:曲线展示
         LineData data=new LineData(lineDataSet);//创建 LineData 对象 属于LineChart 折线图的数据集合
         income_chart.setData(data);// 添加到图表中
     }
     //4 支出汇总分析--------------------代码
     private void outComeData() {
         //第一部分:获取数据
         Cursor cursor =db.rawQuery("select * from pay_out",null);
         while(cursor.moveToNext()){
             Double mymoney=cursor.getDouble(cursor.getColumnIndex("outmoney"));
             String mytype=cursor.getString(cursor.getColumnIndex("outtype"));
             if(mytype.equals("电影-娱乐")){
                 dyylmoney+=mymoney;
             }else if(mytype.equals("美食-畅饮")){
                 mscymoney+=mymoney;
             }else if(mytype.equals("欢乐-购物")){
                 hlgwmoney+=mymoney;
             }else if(mytype.equals("手机-充值")){
                 sjczmoney+=mymoney;
             }else if(mytype.equals("交通-出行")){
                 jtcxmoney+=mymoney;
             }else if(mytype.equals("教育-培训")){
                 jypxmoney+=mymoney;
             }else if(mytype.equals("社交-礼仪")){
                 sjlymoney+=mymoney;
             }else if(mytype.equals("生活-日用")){
                 shrymoney+=mymoney;
             }else if(mytype.equals("其他")){
                 othermoney+=mymoney;
             }
         }
         //第二部分:LineChart 图表初始化设置---Xy 轴的设置
         XAxis xAxis=outpay_chart.getXAxis();//获取此图表的 x 轴轴线
         YAxis yAxisleft =outpay_chart.getAxisLeft();//获取此图表的 Y 轴左侧轴线
         YAxis yAxisright =outpay_chart.getAxisRight();//获取此图表的 Y 轴右侧轴线
         xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置 X 轴线的位置为底部
         yAxisleft.setAxisMinimum(0f);//保证 Y 轴从 0 开始,不然会上移一点。
         yAxisright.setAxisMinimum(0f);
         xAxis.setValueFormatter(new IAxisValueFormatter() {//x 轴自定义标签的设置
             @Override
             public String getFormattedValue(float v, AxisBase axisBase) {
                 return outdata[(int) v];
             }
         });
         //第三部分:LineDataSet 曲线初始化设置
         List<Entry> outentries=new ArrayList<>();//Y 轴的数据
         outentries.add(new Entry(0,dyylmoney));
         outentries.add(new Entry(1,mscymoney));
         outentries.add(new Entry(2,hlgwmoney));
         outentries.add(new Entry(3,sjczmoney));
         outentries.add(new Entry(4,jtcxmoney));
         outentries.add(new Entry(5,jypxmoney));
         outentries.add(new Entry(6,sjlymoney));
         outentries.add(new Entry(7,shrymoney));
         outentries.add(new Entry(8,othermoney));
         LineDataSet lineDataSet=new LineDataSet(outentries,"金额");//代表一条线,“金额”是曲线名称
         lineDataSet.setValueTextSize(25);//曲线上文字的大小
         lineDataSet.setValueTextColor(Color.WHITE);//曲线上文字的颜色
         lineDataSet.setDrawFilled(true);//设置折线图填充
         //第四部分:曲线展示
         LineData data=new LineData(lineDataSet);//创建 LineData 对象 属于LineChart 折线图的数据集合
         outpay_chart.setData(data);// 添加到图表中
     }
}


点击全文阅读


本文链接:http://zhangshiyu.com/post/35759.html

图表  设置  数据  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1