1,首先我们来看两段代码:
第一段:关于用MPAndroidChart对于图标的设置,这个设置一般都是固定的也是特别好懂,
ColorTemplate mCt;
mCt = new ColorTemplate();
mCt.addDataSetColors(ColorTemplate.PASTEL_COLORS, this);
mChart = (PieChart) headView.findViewById(R.id.spread_pie_chart);
mChart.setColorTemplate(mCt);
mChart.setDescription("");
mChart.setHoleRadius(30f);
mChart.setTransparentCircleRadius(0f);
mChart.setCenterTextSize(18f);
mChart.setDrawXValues(true);
mChart.setUsePercentValues(true);
mChart.setDrawLegend(false);
// space between slices
mChart.setSliceSpace(1f);
mChart.setDrawHoleEnabled(false);
mChart.setTouchEnabled(false);
第二段,是关于数据的设置,这里设置少为复杂一点
首先我们来看代码,
ArrayList<Entry> yVals = new ArrayList<Entry>();//创建y轴的arraylist
ArrayList<String> xVals = new ArrayList<String>();//创建x轴的arraylist
for (int i = 0; i < listDatas.size(); i++) {
yVals.add(new Entry((float)listDatas.get(i).getProvinceCount(), i));
//添加y轴的数据,这里添加y轴的数据稍微复杂一点,其中包括,Entry和数据对应的序号。
xVals.add(listDatas.get(i).getProvinceName());//添加y轴数据,这里添加为序号对应的名称。
}
//还没有完,下边需要设置DataSet,我理解的是DataSet是图例,就是给y轴设置一个图例,就是表示这个y轴的值表示的是什么,这里这个y轴标识的content
DataSet set1 = new DataSet(yVals, "Content");
//然后再设置一个ArrayList<DataSet>,保存设置好图例的y变量值
ArrayList<DataSet> dataSets = new ArrayList<DataSet>();
//将值添加到dataSet中
dataSets.add(set1);
//现在开始往图标里边去添加数据了,一个是x轴的值,一个是处理好的y轴的值对象。
ChartData data = new ChartData(xVals, dataSets);
mChart.setData(data);
2,如果单纯看以上的注释和代码不能够理解,或者理解不够深入,我们继续讲一个例子。加深一下理解。
因此,什么是DataSet为什么需要它?那实际上相当简单。在图表内互相在一起的数据集对象表示一组条目(数据条目类型)。它被设计用来区分在图表中逻辑上不同组的值。对于每种类型的图表,扩展数据集 (例如 LineDataSet) 的不同对象存在允许特定的样式。 作为一个例子,你可能想用LineChart展示两个不同公司的季度收入在一年中的。在这种情况下,建议你创建两个不同的LineDataSet对象,每个包含四个值(每个代表一个季度)。用ArrayList来描述x轴上的标签,你可以简单的提供四个字符串“1.Q”,“2.Q”,“3.Q”,“4.Q"
当然,你只提供一个包含两个公司8个值的LineDataSet对象也是可以的。
那么怎么设置一个LinDataSet对象呢?
public LineDataSet(ArrayList<Entry> yVals, String label) { ...}
在查找构造函数时(不同的构造函数可用),它是可见的,LinedataSet需要一个ArrayList条目类型和一个字符串用来描述LineDataSet以及用于图表标签。更进一步这个标签能被用来寻找在LineData对象中除LineDataSet对象外的其他LineDataSet。 ArrayList条目类型封装了图表的所有值。一个Entry对象除了封装它周围的值还保存了它自己的值,它的位置在x轴(在LineData对象的字符串类型的ArrayList里面值的索引被映射):
public Entry(float val, int xIndex) { ... }
把它们放在一起(例如两个公司 一年里的季度收入): 首先,创建Entry的类型的列表保存你的值:
ArrayList<Entry> valsComp1 = new ArrayList<Entry>();
ArrayList<Entry> valsComp2 = new ArrayList<Entry>();
然后,填充列表用Entry对象。确保entry对象包含正确的x轴的索引(当然,一个循环能在这儿被使用,在这种情况下,循环计数器可以为x轴的索引)。
Entry c1e1 = new Entry(100.000f, 0); // 0 == quarter 1
valsComp1.add(c1e1);
Entry c1e2 = new Entry(50.000f, 1); // 1 == quarter 2 ...
valsComp1.add(c1e2);
// and so on ...
Entry c2e1 = new Entry(120.000f, 0); // 0 == quarter 1
valsComp2.add(c2e1);
Entry c2e2 = new Entry(110.000f, 1); // 1 == quarter 2 ...
valsComp2.add(c2e2);
//..
现在我们有了Entry对象的列表,LineDataSet对象可以被创建:
LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1");
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2");
但是还没完,我们创建一个DataSets的列表和一个x轴条目的列表并且构建我们的ChartData对象:
ArrayList<LineDataSet> dataSets = new ArrayList<LineDataSet>();
dataSets.add(setComp1);
dataSets.add(setComp2);
ArrayList<String> xVals = new ArrayList<String>();
xVals.add("1.Q"); xVals.add("2.Q"); xVals.add("3.Q"); xVals.add("4.Q");
LineData data = new LineData(xVals, dataSets);
mLineChart.setData(data);
mLineChart.invalidate(); // refresh
在调用了invalidate()之后图表被刷新并且提供的数据被绘制。