AChartEngine分析:
AChartEngine是一个开源的绘图引起,支持的功能比较强大,可以绘制各种图形数据,但是代码量不少,而且封装性比较好,要满足自己的需求定制,还需要看懂代码结构,
这样如果完成需求不是太复杂的,只有个别的图表的时候可以直接参考。本分析主要分析绘图过程,不分析框架结构。
AChartEngine的绘制数据主要结构如下:
AbstractChart主要定义绘制的主要逻辑,如绘制数据,绘制背景,绘制图例等,具体实现在xychart,roundchart中。
--------------------------------分析1:响应用户刷新过程-----------------------------------------------
数据的动态展示,achartengine绘制数据的时候是提前将数据提供好,然后一次绘制完成,不是动态加载,就是说不是跟随用户的拖动动态的更新数据量多少,而是在绘制完成后,随着用户拖动,计算拖动偏移量,或者放大缩小量,重新计算屏幕点位置,重新绘制。
这块的分析见下:
GraphicalView的onTouchEvent方法负责监听用户交互事件,然后将事件交给touchhandler,touchhandler主要有两个实现,根据版本分为oldtouch和touch,本分析使用touchhandler,具体见mTouchHandler.handleTouch(event),这里会重新计算然后重新绘制,见:
mPan.apply(oldX, oldY, newX, newY);
graphicalView.repaint();
repaint方法见下:
public void repaint() {
mHandler.post(new Runnable() {
public void run() {
invalidate();
}
});
}
会强制重新走一次onDraw进行绘制。
----------------------分析2:具体绘制展现---------------------------------
绘制流程分析:
绘制主要在graphicview中完成,这里使用abstract class 即abstractchart来完成绘制,在构造器中实例化,选择是xychart还是roundchart,然后在onDraw中绘制,见
public abstract void draw(Canvas canvas, int x, int y, int width, int height, Paint paint);
以xychart为例,目前绘制主要分几步,按次序来绘制,先绘制整体背景,见
drawBackground(mRenderer, canvas, x, y, width, height, paint, false, DefaultRenderer.NO_COLOR);
然后开始绘制数据曲线,代码在绘制整体背景之后,然后绘制四边四个背景,为的是挡住不需要看到的数据,使数据只展示在一个矩形中,最后然后绘制坐标,标注等。
绘制四个背景见:
// draw stuff over the margins such as data doesn't render on these areas
drawBackground(mRenderer, canvas, x, bottom, width, height - bottom, paint, true,
mRenderer.getMarginsColor());
drawBackground(mRenderer, canvas, x, y, width, margins[0], paint, true,
mRenderer.getMarginsColor());
if (or == Orientation.HORIZONTAL) {
drawBackground(mRenderer, canvas, x, y, left - x, height - y, paint, true,
mRenderer.getMarginsColor());
drawBackground(mRenderer, canvas, right, y, margins[3], height - y, paint, true,
mRenderer.getMarginsColor());
} else if (or == Orientation.VERTICAL) {
drawBackground(mRenderer, canvas, right, y, width - right, height - y, paint, true,
mRenderer.getMarginsColor());
drawBackground(mRenderer, canvas, x, y, left - x, height - y, paint, true,
mRenderer.getMarginsColor());
}
其中具体数据都在xychart或者roundchart的子类中具体提供,见xychart中
if (points.size() > 0) {
drawSeries(series, canvas, paint, points, seriesRenderer, yAxisValue, i, or, startIndex);
ClickableArea[] clickableAreasForSubSeries = clickableAreasForPoints(points, values,
yAxisValue, i, startIndex);
clickableArea.addAll(Arrays.asList(clickableAreasForSubSeries));
}
------------------------------------分析3:绘制流程-------------------------------------------------------------------
绘制流程分析,即从提供数据到绘制完成,数据具体是怎么绘制出来的
此处以AverageTemperatureChart 为例说明:
从execute方法开始执行,这里提供了要展示的所有数据,x,y数据,title数据,对这个坐标系做了参数设置,然后开始整理数据,见
XYMultipleSeriesDataset dataset = buildDataset(titles, x, values);
将数据整理成若干序列,然后在绘制调用次序如下
Intent intent = ChartFactory.getLineChartIntent(context, dataset, renderer,
"Average temperature");
然后到 XYChart chart = new LineChart(dataset, renderer);
然后绘制在xychart的draw中完成最终绘制。
综上:如果自己写代码完成绘制,简单点的,可以按如下步骤来实现:
1:写abstractchart,定义绘制的任务,绘制背景,绘制坐标轴,绘制标注,定义abstract draw方法
2:写一个具体实现,如xychart 实现具体draw方法
3:写一个renderer渲染类,负责paint的style,color,stroke和其他一些配置参数
4:定义一个touchhandler类,负责和用户拖动交互并且重新计算数据
5:定义一个graphicalview,负责具体绘制展示,将最终的view展示出来
本分析先到这里
介绍俩网址,对此进行说明:
http://jaxenter.com/effort-free-graphs-on-android-with-achartengine-46199.html
和
http://www.javaadvent.com/2012/12/achartengine-charting-library-for.html
使用范例见如下链接:
http://www.tuicool.com/articles/jMN3uu