最近要做一个折线图,就搜到了 MPAndroidChart

效果图如下

MPAndroidChart绘制后的效果图

gradle 引入

compile 'com.github.PhilJay:MPAndroidChart:v3.0.0-beta'

以下是Activity的代码

布局文件很简单就包含一个com.github.mikephil.charting.charts.LineChart标签,不再给出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package febsky.me.testmpchart;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.AxisValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import java.util.ArrayList;
public class MultiLineActivity extends AppCompatActivity implements OnChartValueSelectedListener {
private LineChart mChart;
private int[] mColors = new int[]{
Color.rgb(255, 0, 0), //红色
Color.rgb(2, 196, 244), //淡蓝色
Color.rgb(2, 123, 243) //深蓝
};
protected String[] mMonths = new String[]{
"1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mulit_line);
mChart = (LineChart) findViewById(R.id.chart);
mChart.setOnChartValueSelectedListener(this);
initChartView();
/**-------------这里的数据不重要,主要用随机数的方式生成点坐标-------------**/
//设置模拟数据
ArrayList<Entry> yVals = new ArrayList<Entry>();
for (int i = 0; i < 12; i++) {
yVals.add(new Entry(i, (float) (Math.random() * 10000f)));
}
ArrayList<Entry> yVals2 = new ArrayList<Entry>();
for (int i = 0; i < 12; i++) {
yVals2.add(new Entry(i, (float) (Math.random() * 10000f)));
}
addDataSet(yVals, "一居");
addDataSet(yVals2, "两居");
/**--------------------------**/
//图标的下边的指示块 图例
Legend l = mChart.getLegend();
l.setForm(Legend.LegendForm.LINE);
l.setXEntrySpace(40);
}
private void initChartView() {
mChart.setDrawGridBackground(false);
mChart.setDescription(""); //右下角说明文字
mChart.setDrawBorders(false); //四周是不是有边框
// mChart.setBorderColor(); //边框颜色,默认黑色?
//控制轴上的坐标绘制在什么地方 上边下边左边右边
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.enableGridDashedLine(10f, 10f, 0f); //给整成虚线
xAxis.setAxisMinValue(0f); //设置轴的最小值。这样设置将不会根据提供的数据自动计算。
xAxis.setGranularity(1f); //缩放的时候有用,比如放大的时候,我不想把横轴的月份再细分
xAxis.setValueFormatter(new AxisValueFormatter() { //绘制横轴显示
@Override
public String getFormattedValue(float value, AxisBase axis) {
return mMonths[(int) value % mMonths.length];
}
@Override
public int getDecimalDigits() {
return 0;
}
});
xAxis.setDrawLabels(true); //是不是显示轴上的刻度
mChart.getAxisRight().setEnabled(false);
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setEnabled(true);
leftAxis.enableGridDashedLine(10f, 10f, 0f);
// enable touch gestures
mChart.setTouchEnabled(true);
// if disabled, scaling can be done on x- and y-axis separately
mChart.setPinchZoom(true);
// enable scaling and dragging
mChart.setDragEnabled(true);
mChart.setScaleEnabled(true);
//一个chart中包含一个Data对象,一个Data对象包含多个DataSet对象,
// 每个DataSet是对应一条线上的所有点(相对于折线图来说)
mChart.setData(new LineData());
}
private void addDataSet(ArrayList<Entry> entryList, String dataSetName) {
LineData data = mChart.getData();
if (data != null) {
int count = data.getDataSetCount();
LineDataSet set = new LineDataSet(entryList, dataSetName);
set.setLineWidth(1.5f);
set.setCircleRadius(3.5f);
int color = mColors[count % mColors.length];
set.setColor(color);
set.setCircleColor(color);
set.setValueTextSize(10f);
set.setDrawValues(false); //节点不显示具体数值
set.setValueTextColor(color);
set.setDrawHorizontalHighlightIndicator(false);//取消横向辅助线
set.setDrawVerticalHighlightIndicator(false); //取消纵向辅助线
data.addDataSet(set);
data.notifyDataChanged();
mChart.notifyDataSetChanged();
mChart.invalidate();
}
}
@Override
public void onValueSelected(Entry e, Highlight h) {
Log.i("Q_M:", e.toString());
}
@Override
public void onNothingSelected() {
}
}