Android图表控件MPAndroidChart之饼状图表介绍(PieChart)

最近需求一些图表的功能,就了解了一下MPAndroidChart框架,感觉用法简单方便,很实用。今天写一写其中关于饼状图表的相关功能介绍,我封装成了一个类,更方便调用。

一,添加依赖:

1 . 在project的build.gradle中添加依赖:

    repositories {
        //......//
        maven { url "https://jitpack.io"}//chart需求
    }

2 . 在app的build.gradle中添加依赖:

dependencies {
    //......//
    implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
}
二,封装类(可以直接用):
import android.graphics.Typeface;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.formatter.PercentFormatter;
import com.github.mikephil.charting.interfaces.datasets.IDataSet;
import java.util.List;
/**
 * 饼状图表
 */
public class MPPieChartManager {
    public PieChart mPieChart;
    private PieDataSet pieDataSet;
    public MPPieChartManager(PieChart pieChart) {
        this.mPieChart = pieChart;
    }

    /**
     * 饼状图中间是否显示中间的洞
     * @param isHole 是否显示中间的洞
     * @param vHole 设置中间洞的大小
     * @param vCircleRadius 半径
     * @param vCircleColor 颜色
     * @param vCircleAlpha 透明度
     * */
    public void initCenter(boolean isHole, float vHole, float vCircleRadius, int vCircleColor, int vCircleAlpha) {
        mPieChart.setDrawHoleEnabled(isHole);// 是否显示中间的洞
        mPieChart.setHoleRadius(vHole);// 设置中间洞的大小
        // 半透明圈
        mPieChart.setTransparentCircleRadius(vCircleRadius);
        mPieChart.setTransparentCircleColor(vCircleColor); //设置半透明圆圈的颜色
        mPieChart.setTransparentCircleAlpha(vCircleAlpha); //设置半透明圆圈的透明度
    }
    /**
     * 饼状图中间是否添加文字
     * @param isTxt 是否添加文字
     * @param txt 设置中间文字
     * @param txtColor 中间文字的颜色
     * @param txtSize 中间文字的大小px
     * */
    public void initCenterText(boolean isTxt, String txt, int txtColor, int txtSize) {
        mPieChart.setDrawCenterText(isTxt); //是否添加文字
        if (isTxt){
            mPieChart.setCenterText(txt); //设置中间文字
            mPieChart.setCenterTextColor(txtColor); //中间文字的颜色
            mPieChart.setCenterTextSizePixels(txtSize);  //中间文字的大小px
            mPieChart.setCenterTextRadiusPercent(1f);
            mPieChart.setCenterTextTypeface(Typeface.DEFAULT); //中间文字的样式
            mPieChart.setCenterTextOffset(0, 0); //中间文字的偏移量
        }
    }
    /**
     * 是否可以手动旋转
     * @param isRation 是否可以手动旋转
     * @param rotationAngle 初始旋转角度
     * @param dfc 设置pieChart图表转动阻力摩擦系数[0,1]
     * @param isPercent 是否显示成百分比
     * */
    public void initRotation(boolean isRation, int rotationAngle, float dfc, boolean isPercent) {
        mPieChart.setRotationEnabled(isRation);// 是否可以手动旋转
        if (isRation){
            mPieChart.setRotationAngle(rotationAngle);// 初始旋转角度
            mPieChart.setDragDecelerationFrictionCoef(dfc);//设置pieChart图表转动阻力摩擦系数[0,1]
        }
        mPieChart.setUsePercentValues(isPercent);//是否显示成百分比
    }
    /**
     * 是否取消右下角描述
     * @param isDescription 是否取消右下角描述
     * */
    public void initDescription(boolean isDescription, String des, int size, int color, float x, float y){//Paint.Align align) {
        mPieChart.getDescription().setEnabled(isDescription); //是否取消右下角描述
        if (isDescription){
            Description description = new Description();
            description.setText(des);
            description.setTextSize(size);
            description.setTextColor(color);
            //description.setTextAlign(align);
            description.setPosition(x, y);
            mPieChart.setDescription(description);
        }
    }
    /**
     * 是否显示每个部分的文字描述
     * @param isDraw 是否显示每个部分的文字描述
     * @param etColor 描述文字的颜色
     * @param etSize 描述文字的大小
     * */
    public void initEntryLabel(boolean isDraw, int etColor, int etSize) {
        mPieChart.setDrawEntryLabels(isDraw);//是否显示每个部分的文字描述
        if (isDraw){
            mPieChart.setEntryLabelColor(etColor); //描述文字的颜色
            mPieChart.setEntryLabelTextSize(etSize);//描述文字的大小
            mPieChart.setEntryLabelTypeface(Typeface.DEFAULT_BOLD); //描述文字的样式
        }
    }
    /**
     * 图相相关
     * @param left 图相对于上下左右的偏移
     * @param top 图相对于上下左右的偏移
     * @param right 图相对于上下左右的偏移
     * @param bom 图相对于上下左右的偏移
     * @param color 图标的背景色
     * */
    public void initExtraOffset(int left, int top, int right, int bom, int color) {
        mPieChart.setExtraOffsets(left, top, right, bom);//图相对于上下左右的偏移
        mPieChart.setBackgroundColor(color);//图标的背景色
    }
    /**
     * 获取图例
     * @param isEnacled 是否启用图列
     * @param orientation 设置图例水平显示: HORIZONTAL / VERTICAL
     * @param vAlignment 垂直布局:TOP/CENTER/BOTTOM
     * @param hAlignment 水平布局:RIGHT/CENTER/LEFT
     * @param xOs x轴的偏移
     * @param yOs y轴的偏移
     * @param color 字颜色
     * @param size 字大小
     * */
    public void initLegend(boolean isEnacled,
                            Legend.LegendOrientation orientation,
                            Legend.LegendVerticalAlignment vAlignment,
                            Legend.LegendHorizontalAlignment hAlignment, float xOs, float yOs, int color, int size) {
        //获取图例
        Legend legend = mPieChart.getLegend();
        legend.setEnabled(isEnacled);
        if (isEnacled){
            legend.setOrientation(orientation);        //设置图例水平显示
            legend.setVerticalAlignment(vAlignment);   //顶部
            legend.setHorizontalAlignment(hAlignment); //右对其
            legend.setForm(Legend.LegendForm.CIRCLE); //设置图例的形状
            legend.setFormToTextSpace(10f);			   //设置每个图例实体中标签和形状之间的间距
            legend.setYOffset(yOs);					   //设置比例块 Y 轴偏移量
            legend.setXOffset(xOs);                    //设置比例块 X 轴偏移量
            legend.setTextColor(color);                //图例文字的颜色
            legend.setTextSize(size);                  //设置图例标签文本的大小
        }
    }
    /**
     * 创建数据
     * @param pieEntryList 数据
     * @param colors 颜色
     * @param title 标题
     * @param sliceSpace 设置饼状Item之间的间隙
     * @param selSpace 设置饼状Item被选中时变化的距离
     * */
    public void initData(List pieEntryList, List colors, String title, int sliceSpace, float selSpace){
        //饼状图数据集 PieDataSet
        pieDataSet = new PieDataSet(pieEntryList, title);
        pieDataSet.setSliceSpace(sliceSpace);           //设置饼状Item之间的间隙
        pieDataSet.setSelectionShift(selSpace);      //设置饼状Item被选中时变化的距离
        pieDataSet.setColors(colors);           //为DataSet中的数据匹配上颜色集(饼图Item颜色)
    }
    /**
     * 设置数据
     * @param pieEntryList 数据
     * */
    public void setData(List pieEntryList) {
        pieDataSet = (PieDataSet) mPieChart.getData().getDataSetByIndex(0);
        pieDataSet.setValues(pieEntryList);
        mPieChart.getData().notifyDataChanged();
    }
    /**
     * 创建数据
     * @param isValueShow 设置是否显示数据实体(百分比,true:以下属性才有意义)
     * @param valueSize 设置所有DataSet内数据实体(百分比)的文本字体大小
     * @param valueColor 设置所有DataSet内数据实体(百分比)的文本颜色
     * @param part1 当值位置为外边线时,表示线的前半段长度
     * @param part2 当值位置为外边线时,表示线的后半段长度
     * @param per 当ValuePosits为OutsiDice时,指示偏移为切片大小的百分比
     * @param lineColor 当值位置为外边线时,表示线的颜色。
     * */
    public void initPercent(boolean isValueShow, int valueSize, int valueColor, float part1, float part2, float per, int lineColor){
        //最终数据 PieData
        PieData pieData = new PieData(pieDataSet);
        pieData.setDrawValues(isValueShow);            //设置是否显示数据实体(百分比,true:以下属性才有意义)
        pieData.setValueTextColor(valueColor);  //设置所有DataSet内数据实体(百分比)的文本颜色
        pieData.setValueTextSize(valueSize);          //设置所有DataSet内数据实体(百分比)的文本字体大小
        pieData.setValueFormatter(new PercentFormatter());//设置所有DataSet内数据实体(百分比)的文本字体格式

        pieDataSet.setValueLinePart1Length(part1);// 当值位置为外边线时,表示线的前半段长度。
        pieDataSet.setValueLinePart2Length(part2);// 当值位置为外边线时,表示线的后半段长度。
        pieDataSet.setValueLinePart1OffsetPercentage(per);// 当ValuePosits为OutsiDice时,指示偏移为切片大小的百分比
        pieDataSet.setValueLineColor(lineColor);// 当值位置为外边线时,表示线的颜色。
        pieDataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);// 设置Y值的位置是在圆内还是圆外

        mPieChart.setData(pieData);
    }

    /**
     * 是否显示百分比
     * */
    public void changePercent(boolean b){
        for (IDataSet set : mPieChart.getData().getDataSets())
        {
            set.setDrawValues(b);
        }
        this.invalidate();
    }
    /**
     * 刷新
     * */
    public void invalidate(){
        mPieChart.invalidate();
    }
    /**
     * 其他设置
     * */
    public void initOther(){
            mPieChart.highlightValues(null);
            mPieChart.setDrawSliceText(true);//是否隐藏饼图上文字
    }
}
三,调用(例子):

1 . 创建:初始化数据并赋值这两个函数一定是要调用的,否则出不来效果,其他的都是样式的设置,可以单独调用,记住调用后一定要刷新一下,这样才能更新。

   private MPPieChartManager mpPieChartManager;
   private void creatPieChart() {
        // 初始化
        mpPieChartManager = new MPPieChartManager(chart_v_PieChart);
        // 自定义数据(根据你自己真实数据添加)
        List yVals1 = new ArrayList<>();
        yVals1.add(new PieEntry(40, "苹果"));
        yVals1.add(new PieEntry(30, "鸭梨"));
        yVals1.add(new PieEntry(15, "香蕉"));
        yVals1.add(new PieEntry(10, "橙子"));
        yVals1.add(new PieEntry(5, "樱桃"));
        List colors = new ArrayList<>();
        colors.add(Color.RED);
        colors.add(Color.BLUE);
        colors.add(Color.GRAY);
        colors.add(Color.YELLOW);
        colors.add(Color.GREEN);

        // ********** 创建  初始化数据并赋值  必写 *************
        mpPieChartManager.initData(yVals1, colors, "饼状图表", 1, 3f);
        mpPieChartManager.initPercent(true, 12, Color.WHITE, 0.8f, 0.8f, 80f, Color.WHITE);


        // ********** 样式设置 *************
        // 是否有中心圆(具体值具体写入)
        mpPieChartManager.initCenter(false, 40f, 30f, getResources().getColor(R.color.colorAccent), 125);
         // 中心圆中是否有字(具体值具体写入)
        mpPieChartManager.initCenterText(false, null, 0, 0);
         // 是否可以拖拽旋转(具体值具体写入)
        mpPieChartManager.initRotation(false, 0, 0f, false);
         // 是否有描述(具体值具体写入, xy值得好好计算)
        mpPieChartManager.initDescription(false, "这是描述", 14, Color.WHITE, 0f, 0f);
        // 是否显示每个部分的文字描述(具体值具体写入)
        mpPieChartManager.initEntryLabel(true, 0, 20);
        // 图表位置及背景(具体值具体写入)
        mpPieChartManager.initExtraOffset(10, 10, 90, 10, Color.BLACK);
         // 获取图例(具体值具体写入)
        mpPieChartManager.initLegend(true, Legend.LegendOrientation.VERTICAL,
                Legend.LegendVerticalAlignment.TOP, Legend.LegendHorizontalAlignment.RIGHT,
                -90f, 0f, Color.WHITE, 14);

         // ********** 刷新( 必写 ) ************
         mpPieChartManager.invalidate();
    }

2 . 刷新数据 :

    private void refreshData(List yVals1) {
        // 刷新调用的方法
        mpPieChartManager.setData(yVals1);
        mpPieChartManager.initPercent(true, 12, Color.WHITE, 0.8f, 0.8f, 80f, Color.WHITE);
        mpPieChartManager.invalidate();
    }

你可能感兴趣的:(Android)