AChartEngine分析

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方法开始执行,这里提供了要展示的所有数据,xy数据,title数据,对这个坐标系做了参数设置,然后开始整理数据,见

XYMultipleSeriesDataset dataset = buildDataset(titles, x, values);

将数据整理成若干序列,然后在绘制调用次序如下

 Intent intent = ChartFactory.getLineChartIntent(context, dataset, renderer,

        "Average temperature");

然后到 XYChart chart = new LineChart(dataset, renderer);

然后绘制在xychartdraw中完成最终绘制。


综上:如果自己写代码完成绘制,简单点的,可以按如下步骤来实现:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值