个人作业——个人技术博客

Android-MPChart:PieChart使用小记


一、添加依赖

Project level build.gradle(在project的build.gradle中添加依赖)
allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' }  //添加
      }
}
App level build.gradle(在app的build.gradle中添加依赖)
dependencies {
    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3' //添加
}


二、layout布局

 <view
     android:id="@+id/PieChart"
     class="com.github.mikephil.charting.charts.PieChart"
     android:layout_width="330dp"
     android:layout_height="250dp"
     android:layout_marginTop="35dp"
     android:gravity="center" />
>


三、数据准备

    private PieChart mPieChart;
    private List<CategoryChartItem> categoryChart = new ArrayList<>();
    class CategoryChartItem
    {
          private String categoryname;
          private Float precent;
          private double money;
     }

  //将数据库获取数据按照CategoryChartItem格式填充到数据源List中
   public List<CategoryChartItem> loadcategoryChart(String begindate,String enddate,boolean typeflag)
   {
        int i;
        String categoryname;
        double allmoney;
        float percent;
        List<CategoryChartItem> mcategoryChart = new ArrayList<>();
        BillDAOImpl billDAO = new BillDAOImpl();
        CategoryDAOImpl categoryDAO = new CategoryDAOImpl();

        allmoney = billDAO.getAllmoney(begin,end,0); //数据库获取总金额
        allmoneystring = String.valueOf(allmoney);
        Map<Integer, Double> dbChartData = billDAO.getCategoryChartData(begin,end,0);
        for (Integer id : dbChartData.keySet())
        {
          if(dbChartData.get(id)!=0)
          {
              categoryname = categoryDAO.getCategoryById(id).getCategory_name();   //数据库获取各个分类名称
              percent = (float)((double)dbChartData.get(id)/allmoney);    //计算各个分类金额所占百分比
              CategoryChartItem c1 = new CategoryChartItem(categoryname,percent*100);
              mcategoryChart.add(c1);   //将数据填充至数据源List中
           }
      } 
      return mcategoryChart;
  }

  //将数据源List中的数据填充至PieEntry中用于显示数据
  private List<PieEntry> setPieChartData(List<CategoryChartItem> chartdata)
  {
      
        List<PieEntry> mPie = new ArrayList<>();
        PieEntry pieEntry;
        for (CategoryChartItem c : chartdata) {
            mPie.add(new PieEntry(c.getPrecent(), c.getCategoryname()));
        }
        return mPie;
  }


四、设置PieChart显示效果

private void ShowPieChart(PieChart pieChart, List<PieEntry> piedata) {
        PieDataSet dataSet = new PieDataSet(piedata, "");
        ArrayList<Integer> mColorList = new ArrayList<Integer>();
        int[] color = {Color.rgb(239, 199, 194),
                Color.rgb(215, 144, 123),
                Color.rgb(232, 221, 181),
                Color.rgb(178, 201, 171),
                Color.rgb(104, 166, 145),
                Color.rgb(108, 75, 94),
                Color.rgb(179, 103, 155),
                Color.rgb(244, 165, 174),
                Color.rgb(125, 130, 184),
                Color.rgb(250, 156, 56)
        };
        for (int c : color) {
            mColorList.add(c);
        }
        dataSet.setColors(mColorList);
        PieData pieData = new PieData(dataSet);
        // 设置描述
        Description description = new Description();
        description.setEnabled(false);
        pieChart.setDescription(description);
        //设置半透明圆环的半径, 0为透明
        pieChart.setTransparentCircleRadius(48f);
        pieChart.setHoleRadius(45f); //半径
        //设置初始旋转角度
        pieChart.setRotationAngle(-15);
        //数据连接线距图形片内部边界的距离,为百分数
        dataSet.setValueLinePart1OffsetPercentage(80f);
        //设置连接线的颜色
        dataSet.setValueLineColor(Color.rgb(77,76,125));
        // 连接线在饼状图外面
        dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
        // 设置饼块之间的间隔
        dataSet.setSliceSpace(1f);
        dataSet.setHighlightEnabled(true);
        // 显示图例
        Legend legend = pieChart.getLegend();
        legend.setEnabled(true);
        legend.setPosition(Legend.LegendPosition.LEFT_OF_CHART);  //左边显示
        legend.setFormSize(12f);//比例块字体大小
        legend.setXEntrySpace(2f);//设置距离饼图的距离,防止与饼图重合
        legend.setYEntrySpace(2f);
        legend.setWordWrapEnabled(true); //比例块换行
        legend.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT);
        // 和四周相隔一段距离,显示数据
        pieChart.setExtraOffsets(26, 5, 26, 5);
        // 设置pieChart图表是否可以手动旋转
        pieChart.setRotationEnabled(true);
        // 设置piecahrt图表点击Item高亮是否可用
        pieChart.setHighlightPerTapEnabled(true);
        // 设置pieChart图表展示动画效果,动画运行1.4秒结束
        pieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
        //设置pieChart是否只显示饼图上百分比不显示文字
        pieChart.setDrawEntryLabels(false);
        //是否绘制PieChart内部中心文本
        pieChart.setDrawCenterText(true);
        pieChart.setCenterText("总支出"+allmoneystring+"元");
        pieChart.setCenterTextColor(Color.DKGRAY);//中间的文字颜色
        pieChart.setCenterTextSize(12);//中间的文字字体大小
        // 绘制内容value,设置字体颜色大小
        pieData.setDrawValues(true);
        pieChart.setUsePercentValues(true);
        pieData.setValueFormatter(new PercentFormatter());
        pieData.setValueTextSize(10f);
        pieData.setValueTextColor(Color.DKGRAY);
        pieChart.setData(pieData);
        // 更新 piechart 视图
        pieChart.postInvalidate();
    }


五、PieChart显示 (写在onCreateView里)

mPieChart = mView.findViewById(R.id.PieChart);
categoryChart = loadcategoryChart(strbeginDate,strendDate,OutcomeFlag);  //设置数据源数据
ShowPieChart(mPieChart, setPieChartData(categoryChart), OutcomeFlag);


六、关于数据刷新的小问题

刚开始刷新数据的时候,以为只需要更新数据源的数据就可以,然而运行之后却发现数据没有更新。后来百度查找原因后找到了解决办法。

categoryChart.clear();  //这步很重要,首先要清空数据源List里的所有数据
categoryChart.addAll(loadcategoryChart(begindate,enddate,flag));  //重新加载数据源数据
ShowPieChart(mPieChart, setPieChartData(categoryChart), flag);


七、

官方文档:
MPAndroidChart中文文档下载地址:

posted @ 2020-06-25 00:34  七yu  阅读(98)  评论(0编辑  收藏  举报