因为最近需要涉及一些数据图形化,所以看了一些博文,大多讲的比较复杂,所以选择一个博主的比较简单的博文里面的源码来进行理解。
参考的博文:http://www.cnblogs.com/vanezkw/archive/2012/07/30/2615165.html
所需要的资源:http://download.csdn.net/detail/jovn_/8418085
AChartEngine的简介就不简介了,要说的是一些博主写的demo有写复杂,对我这种刚接触AChartEngine的新人来说代码没注释看着有点吃力,这里就把原博主代码进行注释。
其实自己注释理解完这个Demo之后对之前比较复杂的实例也能够理解了。
直接上代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 构建数据
String[] titles = new String[] { "心率" };
List<double[]> x = new ArrayList<double[]>();
for (int i = 0; i < titles.length; i++) {
x.add(new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19 });
}
List<double[]> valueList = new ArrayList<double[]>();
valueList.add(new double[] { 12.3, 12.5, 13.8, 16.8, 20.4, 24.4, 26.4,
26.1, 23.6, 20.3, 17.2, 13.9, 14, 12, 16.4, 18.7, 20.6, 23.5,
26.7 });// 标记点数据
int[] colors = new int[] { Color.GREEN };// 线条颜色
PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE };// 标记点的样式
XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
int lengths = renderer.getSeriesRendererCount();// 返回一个简单的渲染对象
for (int i = 0; i < lengths; i++) {
((XYSeriesRenderer) renderer.getSeriesRendererAt(i))
.setFillPoints(true);// 设置图表是否要填满
}
// 建立图表
setChartSettings(renderer, "心率历史", "历史", "心率 次/min", 0.5, 13.5, -10,
40, Color.LTGRAY, Color.LTGRAY);
renderer.setXLabels(13);// 设置X轴节点的个数,根据setChartSettings的最大值和最小值自动计算点的间隔
renderer.setYLabels(10);// 设置Y轴节点个数
renderer.setShowGrid(true);// 设置图表内的网格是否可见
renderer.setXLabelsAlign(Align.RIGHT);// 设置XY轴方向
renderer.setYLabelsAlign(Align.RIGHT);
renderer.setZoomButtonsVisible(false);// 设置放大缩小的按钮是否可见
renderer.setPanLimits(new double[] { -10, 20, -10, 40 });// 设置拖动图表时X轴Y轴允许的最大值最小值,设置此项才可以拖动图表
renderer.setZoomLimits(new double[] { -10, 20, -10, 40 });// 设置放大缩小时的XY轴允许的最大值和最小值.
// 创建视图,利用图表工厂类返回的折线图方法getLineChartView创建折线图的一个View
View view = ChartFactory.getLineChartView(this,
buildDataset(titles, x, valueList), renderer);
view.setBackgroundColor(Color.BLACK);
setContentView(view);
}
// 用XYMultipleSeriesDataset函数构造数据
private XYMultipleSeriesDataset buildDataset(String[] titles,
List<double[]> xValues, List<double[]> yValues) {
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
addXYSeries(dataset, titles, xValues, yValues, 0);
return dataset;
}
// 用于构造点与点之间的连线
private void addXYSeries(XYMultipleSeriesDataset dataset, String[] titles,
List<double[]> xValues, List<double[]> yValues, int scale) {
int length = titles.length;
for (int i = 0; i < length; i++) {
// XYSeries是用于构造图形的
XYSeries series = new XYSeries(titles[i], scale);
double[] xV = xValues.get(i);
double[] yV = yValues.get(i);
int seriesLength = xV.length;
// 此处一个图表有多条折线时候才用for循环遍历,为方便,一条折线也用for循环
for (int j = 0; j < seriesLength; j++) {
series.add(xV[j], yV[j]);
}
dataset.addSeries(series);
}
}
// 构建图标的方法,传入渲染器、图标标题XY轴标题、XY最大最小值、图表背景色以及折线图方块线的颜色
private void setChartSettings(XYMultipleSeriesRenderer renderer,
String title, String xTitle, String yTitle, double xMin,
double xMax, double yMin, double yMax, int axesColor,
int labelsColor) {
// 设置传入的各属性值
renderer.setChartTitle(title);
renderer.setXTitle(xTitle);
renderer.setYTitle(yTitle);
renderer.setXAxisMin(xMin);
renderer.setXAxisMax(xMax);
renderer.setYAxisMin(yMin);
renderer.setYAxisMax(yMax);
renderer.setAxesColor(axesColor);
renderer.setLabelsColor(labelsColor);
}
// 构造XY坐标系显示用渲染图
private XYMultipleSeriesRenderer buildRenderer(int[] colors,
PointStyle[] styles) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
setRenderer(renderer, colors, styles);
return renderer;
}
private void setRenderer(XYMultipleSeriesRenderer renderer, int[] colors,
PointStyle[] styles) {
// 设置各属性的大小
renderer.setAxisTitleTextSize(16);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(20);
renderer.setLegendTextSize(20);
renderer.setPointSize(5f);
/**
* 官方解释Sets the margins,in pixels. an array containing the margin size
* values, in this order:top, left, bottom, right 设置整个图表的边距top, left,
* bottom, right属性
*/
renderer.setMargins(new int[] { 20, 30, 15, 20 });
// 下面的for本是多余的,当一个图表中有多个线条时才会用到for循环来逐个添加,这为了以后开发方便直接用for
for (int i = 0; i < colors.length; i++) {
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(colors[i]);
r.setPointStyle(styles[i]);
renderer.addSeriesRenderer(r);
}
}
}
然后要说一下的是资源里面的官方Demo里,有一个AbstractDemoChart类,这个类相当于一个工具类,其实就是把上面的源码中的一些方法抽象出来,便于重用。
以上有不对的地方还望各位大佛们指正。