基于开源框架AChartEnginee绘制图表表格,实现显示数据折线图,对比功能。效果图如下:
新建工程
通过Android studio新建项目,添加achartenginee.jar依赖。点击下载jar
初始化图表
数据集
根据需求设置多条曲线,一条曲线对应一个XYSeries实例
series = new XYSeries(title);
series2 = new XYSeries("123");
// 创建一个数据集的实例,这个数据集将被用来创建图表
mDataset = new XYMultipleSeriesDataset();
// 将点集添加到这个数据集中
mDataset.addSeries(series);
mDataset.addSeries(series2);
属性样式
设置曲线样式,这里要注意,一条曲线执行一次如下设置,以顺序相互对应,否则将会报错:Datasetand renderer should not be null andshould have the same number of series
XYSeriesRenderer r = new XYSeriesRenderer();
// 设置图表中曲线本身的样式,包括颜色、点的大小以及线的粗细等
r.setColor(color);
r.setPointStyle(style);
r.setFillPoints(fill);
r.setLineWidth(3);
renderer.addSeriesRenderer(r);
设置图表样式
// 有关对图表的渲染可参看api文档
renderer.setApplyBackgroundColor(true);
renderer.setBackgroundColor(getResources().getColor(
R.color.black));
renderer.setChartTitle(title);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(19);// 设置坐标轴标签文字的大小
renderer.setXTitle(xTitle);
renderer.setYTitle(yTitle);
renderer.setXAxisMin(xMin);
renderer.setXAxisMax(xMax);
renderer.setYAxisMin(yMin);
renderer.setYAxisMax(yMax);
//renderer.setYAxisAlign(Align.RIGHT, 0);//用来调整Y轴放置的位置,表示将第一条Y轴放在右侧
renderer.setAxesColor(axesColor);
renderer.setLabelsColor(labelsColor);
renderer.setShowGrid(true);
renderer.setGridColor(Color.GRAY);
renderer.setXLabels(10);//若不想显示X标签刻度,设置为0 即可
renderer.setYLabels(10);
renderer.setLabelsTextSize(18);// 设置坐标轴标签文字的大小
renderer.setXLabelsColor(labelsColor);
renderer.setYLabelsColor(0, labelsColor);
renderer.setYLabelsVerticalPadding(-5);
renderer.setXTitle("");
renderer.setYTitle("");
renderer.setYLabelsAlign(Align.RIGHT);
renderer.setAxisTitleTextSize(20);
renderer.setPointSize((float) 1);
renderer.setShowLegend(false);
renderer.setFitLegend(true);
renderer.setMargins(new int[] { 30, 45, 10, 20 });// 设置图表的外边框(上/左/下/右)
//表格边框颜色
renderer.setMarginsColor(getResources().getColor(
R.color.cardio_bg_color));
显示数据
这里我们是模拟实时数据,通过handler递归调用不断获取新数据
Runnable runnable = new Runnable() {
@Override
public void run() {
ArrayList<Integer> datas = new ArrayList<Integer>();
for (int i = 0; i < 1; i++) {
datas.add(random.nextInt(2000)+500);
}
ArrayList<Integer> datas2 = new ArrayList<Integer>();
for (int i = 0; i < 1; i++) {
datas2.add(random.nextInt(2000)+500);
}
updateCharts(datas);
updateChartsMoreLine(datas2);
handler.postDelayed(this, POINT_GENERATE_PERIOD);
}
};
protected void updateCharts(ArrayList<Integer> datas) {
for (int addY : datas) {
series.add(i, addY);
i++;
}
if (i < MAX_POINT) {
renderer.setXAxisMin(0);
renderer.setXAxisMax(MAX_POINT);
} else {
renderer.setXAxisMin(series.getItemCount() - MAX_POINT);
renderer.setXAxisMax(series.getItemCount());
}
chart.repaint();
}
protected void updateChartsMoreLine(ArrayList<Integer> datas) {
for (int addY : datas) {
series2.add(i2, addY);
i2++;
}
chart.repaint();
}