public CurveChartRender(
     ICurveData curveData, IXAxisData xAxisData, IYAxisData yAxisData, float offset) {
   super();
   this.curveData = curveData;
   this.xAxisData = xAxisData;
   this.yAxisData = yAxisData;
   this.offset = offset;
   cubicPaint.setStyle(Paint.Style.STROKE);
   cubicPaint.setAntiAlias(true);
   outpointPaint.setStyle(Paint.Style.FILL);
   outpointPaint.setAntiAlias(true);
   inPointPaint.setStyle(Paint.Style.FILL);
   inPointPaint.setAntiAlias(true);
   cubicPaint.setStrokeWidth(curveData.getPaintWidth());
   outpointPaint.setStrokeWidth(cubicPaint.getStrokeWidth());
   inPointPaint.setStrokeWidth(cubicPaint.getStrokeWidth());
   intensity = curveData.getIntensity();
 }
  @Override
  public void drawGraph(Canvas canvas, float animatedValue) {
    float prevDx = 0f;
    float prevDy = 0f;
    float curDx = 0f;
    float curDy = 0f;

    PointF prevPrev = curveData.getValue().get(0);
    PointF prev = prevPrev;
    PointF cur = prev;
    PointF next = curveData.getValue().get(1);

    pointList.clear();
    cubicPath.moveTo(
        (cur.x - xAxisData.getMinimum()) * xAxisData.getAxisScale(),
        -(cur.y - yAxisData.getMinimum()) * yAxisData.getAxisScale() * animatedValue);
    /** 保存 */
    pointList.add(
        new PointF(
            (cur.x - xAxisData.getMinimum()) * xAxisData.getAxisScale(),
            -(cur.y - yAxisData.getMinimum()) * yAxisData.getAxisScale() * animatedValue));

    for (int j = 1; j < curveData.getValue().size(); j++) {
      prevPrev = curveData.getValue().get(j == 1 ? 0 : j - 2);
      prev = curveData.getValue().get(j - 1);
      cur = curveData.getValue().get(j);
      next = curveData.getValue().size() > j + 1 ? curveData.getValue().get(j + 1) : cur;

      prevDx = (cur.x - prevPrev.x) * intensity * xAxisData.getAxisScale();
      prevDy = (cur.y - prevPrev.y) * intensity * yAxisData.getAxisScale();
      curDx = (next.x - prev.x) * intensity * xAxisData.getAxisScale();
      curDy = (next.y - prev.y) * intensity * yAxisData.getAxisScale();

      cubicPath.cubicTo(
          (prev.x - xAxisData.getMinimum()) * xAxisData.getAxisScale() + prevDx,
          -(((prev.y - yAxisData.getMinimum()) * yAxisData.getAxisScale() + prevDy)
              * animatedValue),
          ((cur.x - xAxisData.getMinimum()) * xAxisData.getAxisScale() - curDx),
          -(((cur.y - yAxisData.getMinimum()) * yAxisData.getAxisScale() - curDy) * animatedValue),
          ((cur.x - xAxisData.getMinimum()) * xAxisData.getAxisScale()),
          -(((cur.y - yAxisData.getMinimum()) * yAxisData.getAxisScale()) * animatedValue));
      /** 保存 */
      pointList.add(
          new PointF(
              (cur.x - xAxisData.getMinimum()) * xAxisData.getAxisScale(),
              -((cur.y - yAxisData.getMinimum()) * yAxisData.getAxisScale()) * animatedValue));
    }

    canvas.save();
    canvas.translate(offset, 0);
    cubicPaint.setColor(curveData.getColor());
    canvas.drawPath(cubicPath, cubicPaint);
    cubicFillPath.addPath(cubicPath);
    cubicPath.rewind();

    /** 填充曲线图 */
    if (curveData.getDrawable() != null) {
      // 填充颜色
      cubicFillPath.lineTo(
          (curveData.getValue().get(curveData.getValue().size() - 1).x - xAxisData.getMinimum())
              * xAxisData.getAxisScale(),
          0);
      cubicFillPath.lineTo(
          (curveData.getValue().get(0).x - xAxisData.getMinimum()) * xAxisData.getAxisScale(), 0);
      cubicFillPath.close();

      canvas.save();
      canvas.clipPath(cubicFillPath);
      curveData
          .getDrawable()
          .setBounds(
              -canvas.getWidth() + (int) xAxisData.getAxisLength(),
              -(int) yAxisData.getAxisLength(),
              (int) xAxisData.getAxisLength(),
              canvas.getHeight() - (int) yAxisData.getAxisLength());
      curveData.getDrawable().draw(canvas);
      canvas.restore();
      cubicFillPath.rewind();
    }

    /** 点绘制 */
    outpointPaint.setColor(curveData.getColor());
    inPointPaint.setColor(Color.WHITE);
    ((IPointData) curveData).setInPaint(inPointPaint);
    ((IPointData) curveData).setOutPaint(outpointPaint);
    if (((IPointData) curveData).getInRadius() == IPointData.NOSETING)
      ((IPointData) curveData).setInRadius(xAxisData.getAxisLength() / 100);
    if (((IPointData) curveData).getOutRadius() == IPointData.NOSETING)
      ((IPointData) curveData).setOutRadius(xAxisData.getAxisLength() / 70);
    for (int j = 0; j < pointList.size(); j++) {
      mPointRender.drawCirclePoint(
          canvas,
          pointList.get(j),
          curveData.getValue().get(j),
          (IPointData) curveData,
          curveData.getTextSize(),
          curveData.getIsTextSize(),
          yAxisData.getDecimalPlaces());
    }
    canvas.restore();
  }