MpAndroidChart

詹钊
2023-12-01

MpAndroidChart使用以及在使用过程中遇到的某些问题

这里先给上一个官方链接吧

https://weeklycoding.com/mpandroidchart-documentation/
这里边有官方示例,有集成的MpAndroidChart APP,也有官方的教程视频,不过好像有点少,并且全英文,画图过程中可能会出些小毛病。数据显示不全,其中有个方法chart.setExtraOffsets (left,top,right,bottom); //用于与边界有边距

LineChart

初始化
List<Entry> lineEntryList;
LineDataSet lineDataSet;
LineData lineData;
private LineChart mChart;
private void initView() {
//初始化图表,数据绑定
    mChart = (LineChart) findViewById (R.id.chart);
    lineEntryList   = new ArrayList<> ();
//第二个参数是那个描述,以及那个Legend ,好像都是被他默认一样了
    lineDataSet  = new LineDataSet (lineEntryList,"线形图");
// 添加数据
    lineData = new LineData ();
    lineData.addDataSet (lineDataSet);
    
//	把数据交给Chart控件
    mChart.setData (lineData);

//记得重绘
    mChart.invalidate ();
}
这里有三种添加数据的方式
// 一
List<ILineDataSet> lineDataSetss  =new ArrayList<> ();
lineData = new LineData (lineDataSetss);

// 二 这里可以放多个LineDataSet ,也可以只放一个
 lineData  = new LineData(lineDataSet,new LineDataSet (null,""));

// 三
lineData = new LineData ();
lineData.addDataSet (lineDataSet);
添加数据,下面添加的是一个随机数
    private void getData() {
        for (int i = 0; i < 10; i++) {
            //添加一个Entry 一个坐标点
            lineEntryList.add (
                new Entry (lineEntryList.size (),new Random 	().nextInt (100))
            );
        }
        //记得刷新,不然这憨憨他不知道是恁么个回事
        lineDataSet.notifyDataSetChanged ();
        lineData.notifyDataChanged ();
        mChart.notifyDataSetChanged ();
        //这里不必重新绘制,当然也允许你重新绘制喽
    }
一些Chart的属性,也就那么点,将就一下吧
    private void initChartStyle() {
        //获得Chart 的 X,左Y,右Y 轴
        XAxis xAxis = mChart.getXAxis ();
        YAxis left = mChart.getAxisLeft ();
        YAxis axisRight = mChart.getAxisRight ();

        /**
         * 以下的属性 , 因为不同的轴他们之间是有联系的,属性差不多都一致,都有,所以我就只拿X轴做示例了,
         * 举一反三啊!
         */
        //设置轴的间隙,另外的轴相似,基本上属性差不多值,应为他们的基类都是一家族的
        xAxis.setGranularity (1f);

        //设置轴的位置,默认在顶层,Top
        xAxis.setPosition (XAxis.XAxisPosition.BOTTOM);

        //设置轴的最小,最大值
        xAxis.setAxisMinimum (0f);
        xAxis.setAxisMaximum (10);

        //设置轴的标签格式
        xAxis.setValueFormatter (new IAxisValueFormatter () {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return value +"日";
            }
        });

        //这个值用于设置它是否绘制,显示
        xAxis.setEnabled (true);

        //网格 色,以及是否绘制
        xAxis.setGridColor (Color.YELLOW);
        xAxis.setEnabled (true);


        //设置是否绘制标签 ,标签居中吗 ? 居中就true
        xAxis.setDrawLabels (true);
        xAxis.setCenterAxisLabels (false);

        //这里设置轴显示的标签数量,force 这个值没有详细了解,但是选true会出一点小问题,x轴的位置,可能不会对应
        xAxis.setLabelCount (8,true);


        //这里是一些LineDataSet 的属性
        //设置它的颜色,可以是当个的颜色,也能是多个,可以 int[]  list<Integer>
        lineDataSet.setColors (Color.RED,Color.GRAY);
        //是否绘制中心的圆洞
        lineDataSet.setDrawCircleHole (false);
        //是不是需要填充
        lineDataSet.setDrawFilled (true);
        //这里设置完它的属性啊,必须的告诉它更新了,得更新了,重绘

        //mChart的一些属性
        mChart.setNoDataText ("木得数据的提示");

        //描述
        Description description = new Description ();
        description.setText ("Hello Chart");
        mChart.setDescription (description);
        //设置是否显示描述
        mChart.getDescription ().setEnabled (true);


        //legend 图表旁边的图示
        Legend legend = mChart.getLegend ();
        legend.setEnabled (true);
        //多个图示时,可以设置它的排列方式,垂直 ||  水平,一般是多条线才会用到
        legend.setOrientation (Legend.LegendOrientation.VERTICAL);
        //设置图示位置  设置它的位置只能垂直的,水平的分开设,
        legend.setVerticalAlignment (Legend.LegendVerticalAlignment.CENTER);
        legend.setHorizontalAlignment (Legend.LegendHorizontalAlignment.RIGHT);

        mChart.invalidate ();
    }

BarChart

BarChart的一些属性,因为大多数属性都是一样的,所以底下就简单讲述一下吧
//初始化数据
 	List<BarEntry> barEntryList;
    BarDataSet barDataSet;
    BarData barData;
    private void initView() {
        mF7BarChart = view.findViewById (R.id.f7_barChart);
        barEntryList = new ArrayList<> ();
        //设置数据,差不多也就这里有点区别了
        barDataSet = new BarDataSet (barEntryList,"");
        //这里和LineChart 属性差不多
        barData = new BarData (barDataSet);
        mF7BarChart.setData (barData);
        mF7BarChart.invalidate ();
    }
这里简述一下他的独有属性吧,它其实有好几种类型,有堆栈(Stack) ,有成组的(Group),,,,多着呢,想要研究就去官方文档吧!
堆栈的与其他的图吧,这里呢,就不详细写了
//成组图主要就是一个方法的调用 group
//官方说法:  7 * ( barSpace + barWidth )  + groupSpace  = 1
//需要显示柱状图的类别 数量
int barAmount = barData.getDataSetCount ();
// 组与组之间的间隙 groupSpace
float groupSpace   =  0.06f;
//这里我为了简单就分开了,组内柱之间的间隙为barSpace,柱宽为barWidth
float barSpace =  ((1f- groupSpace) / barAmount  )*0.01f;
float barWidth =  ((1f- groupSpace) / barAmount  )*0.99f;
//设置柱宽
barData.setBarWidth (barWidth);
//这个方法是必须的,不能少,少了就完了
mBarChart.groupBars (0,groupSpace,barSpace);
//设置完记得刷新,重新绘制
mBarChart.invalidate();

HorizontalBarChart

这是一个单独的控件,使用方法和BarChart的写法几乎一模一样,只不过X轴的位置变成了左右,左右变成了上下而已,差不多就是将BarChart 翻转了一下而已,可以理解为向右旋转了90度而已,这里就不做解释了

PieChart

饼图也是常见的一种图表,它的使用方法,和前边的图示有点类似,只不过它有一些地方有点坑

我花费了大半天撸它,难受的一批呀!

    //首先初始化
	PieDataSet pieDataSet ;
    PieData pieData;
    List<PieEntry> pieEntries;
    private void initView() {
        pieEntries = new ArrayList<> ();
        mF7PieChart = view.findViewById (R.id.f7_pieChart);
        //这里我长教训了,PieChart这个图表好像需要给他数据,不然它死活不搭理你呀,getData();方法用于获取数据,
        getData();
        pieDataSet = new PieDataSet (pieEntries,"");
        pieData = new PieData (pieDataSet);
        mF7PieChart.setData (pieData);
        mF7PieChart.invalidate ();
    }

这里稍微写了点PieChart的属性

//设置是否绘制中间的那个洞
mF7PieChart.setDrawHoleEnabled (false);
//是否绘制值的那个标签
pieDataSet.setDrawValues (true);
//pieData特有的,就是那个值引出的线,两条
pieDataSet.setValueLinePart1Length (0.5f);
pieDataSet.setValueLinePart2Length (1.05f);
//设置这个部分之间的间隙,给点白边间隙
pieDataSet.setSliceSpace (6f);
//设置是否绘制饼图 Entry的标签
mF7PieChart.setDrawEntryLabels (false);
mF7PieChart.setDrawCenterText (false);
//这个是为了避免太靠边,导致值显示不全,这个方法
mF7PieChart.setExtraOffsets (20,50,20,10);

//设置这个部分之间的间隙,给点白边间隙
pieDataSet.setSliceSpace (6f);
//设置是否绘制饼图 Entry的标签
mF7PieChart.setDrawEntryLabels (false);
mF7PieChart.setDrawCenterText (false);
//这个是为了避免太靠边,导致值显示不全,这个方法
mF7PieChart.setExtraOffsets (20,50,20,10);

//这里记得刷新,
mF7PieChart.invalidate();

 类似资料: