最近项目要统计巡查数据以柱状图表示各区域、各时段、各类巡查对象数量及变化趋势,数据需要自己替换,可以用List封装;
字体、颜色都可以根据自己需求更改
第一步
implementation ‘com.github.PhilJay:MPAndroidChart:v3.0.1’
maven { url “https://jitpack.io” }
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
编译完没问题后:
首先是布局
第二步
条形统计图
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/chart"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_margin="10dp"
android:padding="20dp" />
扇形统计图
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/chart2"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_margin="10dp"
android:padding="20dp" />
需要哪种就用哪种直接放在activity布局里就可以了
第三步
在Activity中直接用这个方法,不要嫌多直接复制能用,大部分都是在设置样式
private BarChart chart;
private void initData1() {
chart = findViewById(R.id.chart);
chart.getDescription().setEnabled(false);
chart.setMaxVisibleValueCount(60);
chart.setPinchZoom(false);
chart.setDrawBarShadow(false);
chart.setDrawGridBackground(false);
chart.animateY(1500);
chart.getLegend().setEnabled(false);
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
ArrayList<BarEntry> values = new ArrayList<>();
//Sum就是代码有几个条形
int sum=7;
for (int i = 0; i < sum; i++) {
float multi = (i + 1);
float val = (float) (int)((Math.random() * multi) + multi / 2);
values.add(new BarEntry(i, val));
}
BarDataSet set1;
if (chart.getData() != null &&
chart.getData().getDataSetCount() > 0) {
set1 = (BarDataSet) chart.getData().getDataSetByIndex(0);
set1.setValues(values);
chart.getData().notifyDataChanged();
chart.notifyDataSetChanged();
} else {
set1 = new BarDataSet(values, "Data Set");
set1.setColors(ColorTemplate.VORDIPLOM_COLORS);
set1.setDrawValues(false);
ArrayList<IBarDataSet> dataSets = new ArrayList<>();
dataSets.add(set1);
BarData data = new BarData(dataSets);
chart.setData(data);
chart.setFitBars(true);
final String[] months = new String[] {
"高家闸建筑用砂矿",
"镇北堡2号建筑用砂矿",
"套门沟老采区3号建筑石料用灰岩矿",
"套门沟5号建筑石料用灰岩矿",
"套门沟老采区1号建筑石料用灰岩矿",
"套门沟老采区2号建筑石料用灰岩矿",
"套门沟石灰石矿山"
};
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
if (value >= 0) {
return months[(int) value % months.length];
} else {
return "";
}
}
});
}
//这里的作用是将X轴上的文字旋转80度
chart.getXAxis().setLabelRotationAngle(-80);
chart.getAxisRight().setEnabled(false);
chart.setScaleYEnabled(false);
chart.setScaleXEnabled(false);
chart.invalidate();
}
多种类型的统计
其实跟上面差不多,同样可以直接拿来用
private BarChart chart1;
private void initData2() {
chart1 = findViewById(R.id.chart1);
chart1.getDescription().setEnabled(false);
chart1.setPinchZoom(false);
chart1.setDrawBarShadow(false);
chart1.setDrawGridBackground(false);
chart1.getAxisRight().setEnabled(false);
Legend l = chart1.getLegend();
l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
l.setOrientation(Legend.LegendOrientation.VERTICAL);
l.setDrawInside(true);
l.setYOffset(0f);
l.setXOffset(10f);
l.setYEntrySpace(0f);
l.setTextSize(8f);
XAxis xAxis = chart1.getXAxis();
xAxis.setGranularity(1f);
xAxis.setCenterAxisLabels(true);
xAxis.setDrawGridLines(false);
YAxis leftAxis = chart1.getAxisLeft();
leftAxis.setValueFormatter(new LargeValueFormatter());
leftAxis.setSpaceTop(35f);
leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
float groupSpace = 0.08f;
float barSpace = 0.03f; // x4 DataSet
float barWidth = 0.2f; // x4 DataSet
// (0.2 + 0.03) * 4 + 0.08 = 1.00 -> interval per "group"
//这里设置X\Y
int k=10;
int groupCount =6 + 1;
int startYear = 5;
int endYear = startYear + groupCount;
ArrayList<BarEntry> values1 = new ArrayList<>();
ArrayList<BarEntry> values2 = new ArrayList<>();
ArrayList<BarEntry> values3 = new ArrayList<>();
ArrayList<BarEntry> values4 = new ArrayList<>();
float randomMultiplier = k * 10f;
//这里控制几种类型,我图上加了四个
for (int i = startYear; i < endYear; i++) {
values1.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
values2.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
values3.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
values4.add(new BarEntry(i, (float) (Math.random() * randomMultiplier)));
}
BarDataSet set1, set2, set3, set4;
if (chart1.getData() != null && chart1.getData().getDataSetCount() > 0) {
set1 = (BarDataSet) chart1.getData().getDataSetByIndex(0);
set2 = (BarDataSet) chart1.getData().getDataSetByIndex(1);
set3 = (BarDataSet) chart1.getData().getDataSetByIndex(2);
set4 = (BarDataSet) chart1.getData().getDataSetByIndex(3);
set1.setValues(values1);
set2.setValues(values2);
set3.setValues(values3);
set4.setValues(values4);
chart1.getData().notifyDataChanged();
chart1.notifyDataSetChanged();
} else {
// create 4 DataSets
set1 = new BarDataSet(values1, "安全生产");
set1.setColor(Color.rgb(104, 241, 175));
set2 = new BarDataSet(values2, "生态保护");
set2.setColor(Color.rgb(164, 228, 251));
set3 = new BarDataSet(values3, "依法生产");
set3.setColor(Color.rgb(242, 247, 158));
set4 = new BarDataSet(values4, "地质灾害");
set4.setColor(Color.rgb(255, 102, 0));
set1.setDrawValues(false);
set2.setDrawValues(false);
set3.setDrawValues(false);
set4.setDrawValues(false);
BarData data = new BarData(set1, set2, set3, set4);
data.setValueFormatter(new LargeValueFormatter());
chart1.setData(data);
}
chart1.getBarData().setBarWidth(barWidth);
// restrict the x-axis range
chart1.getXAxis().setAxisMinimum(startYear);
// barData.getGroupWith(...) is a helper that calculates the width each group needs based on the provided parameters
chart1.getXAxis().setAxisMaximum(startYear + chart1.getBarData().getGroupWidth(groupSpace, barSpace) * groupCount);
chart1.groupBars(startYear, groupSpace, barSpace);
final String[] months = new String[] {
"高家闸建筑用砂矿",
"镇北堡2号建筑用砂矿",
"套门沟老采区3号建筑石料用灰岩矿",
"套门沟5号建筑石料用灰岩矿",
"套门沟老采区1号建筑石料用灰岩矿",
"套门沟老采区2号建筑石料用灰岩矿",
"套门沟石灰石矿山"
};
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
if (value >= 0) {
return months[(int) value % months.length];
} else {
return "";
}
}
});
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
chart1.getXAxis().setLabelRotationAngle(-80);
chart1.setScaleYEnabled(false);
chart1.setScaleXEnabled(false);
chart1.invalidate();
}
扇形统计
这里需要绑定PieChart
private PieChart chart3;
private void initData3() {
chart3 = findViewById(R.id.chart2);
chart3.setUsePercentValues(true);
chart3.getDescription().setEnabled(false);
chart3.setExtraOffsets(5, 10, 5, 5);
chart3.setDragDecelerationFrictionCoef(0.95f);
chart3.setCenterText(generateCenterSpannableText());
chart3.setDrawHoleEnabled(true);
chart3.setHoleColor(Color.WHITE);
chart3.setTransparentCircleColor(Color.WHITE);
chart3.setTransparentCircleAlpha(110);
chart3.setHoleRadius(58f);
chart3.setTransparentCircleRadius(61f);
chart3.setDrawCenterText(true);
chart3.setRotationAngle(0);
// enable rotation of the chart by touch
chart3.setRotationEnabled(true);
chart3.setHighlightPerTapEnabled(true);
chart3.animateY(1400, Easing.EasingOption.EaseInOutQuad);
// chart.spin(2000, 0, 360);
Legend l = chart.getLegend();
l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
l.setOrientation(Legend.LegendOrientation.VERTICAL);
l.setDrawInside(false);
l.setXEntrySpace(7f);
l.setYEntrySpace(0f);
l.setYOffset(0f);
// entry label styling
chart3.setEntryLabelColor(Color.BLACK);
chart3.setEntryLabelTextSize(12f);
ArrayList<PieEntry> entries = new ArrayList<>();
// NOTE: The order of the entries when being added to the entries array determines their position around the center of
// the chart.
//count 是有几种类型,我写的四种;
int count = 4;
float range = 50;
final String[] parties = new String[] {
"安全生产", "生态保护", "依法生产", "地质灾害", "Party E", "Party F", "Party G", "Party H",
"Party I", "Party J", "Party K", "Party L", "Party M", "Party N", "Party O", "Party P",
"Party Q", "Party R", "Party S", "Party T", "Party U", "Party V", "Party W", "Party X",
"Party Y", "Party Z"
};
for (int i = 0; i < count ; i++) {
entries.add(new PieEntry((float) ((Math.random() * range) + range / 5),
parties[i % parties.length],
getResources().getDrawable(R.drawable.bg_button)));
}
PieDataSet dataSet = new PieDataSet(entries, "");
dataSet.setSliceSpace(3f);
dataSet.setSelectionShift(5f);
ArrayList<Integer> colors = new ArrayList<>();
for (int c : ColorTemplate.VORDIPLOM_COLORS)
colors.add(c);
for (int c : ColorTemplate.JOYFUL_COLORS)
colors.add(c);
for (int c : ColorTemplate.COLORFUL_COLORS)
colors.add(c);
for (int c : ColorTemplate.LIBERTY_COLORS)
colors.add(c);
for (int c : ColorTemplate.PASTEL_COLORS)
colors.add(c);
colors.add(ColorTemplate.getHoloBlue());
dataSet.setColors(colors);
//dataSet.setSelectionShift(0f);
PieData data = new PieData(dataSet);
data.setValueFormatter(new PercentFormatter());
data.setValueTextSize(11f);
data.setValueTextColor(Color.BLACK);
chart3.setData(data);
// undo all highlights
chart3.highlightValues(null);
chart3.invalidate();
}
一大半全都是设置属性,如果属性不清楚的可以去这篇博主写的文章看看,里面属性还是挺全的
https://www.cnblogs.com/Sharley/p/8492893.html