本篇介绍曲线图标RecyclerBezierChart 的制作, 相同图表的公共部分的制作这儿不再做介绍,主体图表的制作逻辑在BezierChartRender类中,其间包括主体曲线的制作以及底部fill部分的渐变色的制作。曲线的制作用的三阶贝塞尔曲线,关于贝塞尔曲线相关的常识读者可自行Google,Android中的三阶贝塞尔曲线的制作API接口,以下为Path构建三阶曲线,其间包括两个Control Points.

RecyclerBezierChart图表绘制

这儿的制作逻辑首要参阅了MPAndroidChart中的曲线制作.

RecyclerBezierChart图表绘制

首先将Entry的 Y值转换成对应的PointF,这个之前图表都有相同的操作,存入originPointFList, 然后经过originPointFList核算对应的 Control Points List, 存入 controList, 其间ControlPoint 这个类笔者自界说的包括了两个Control Point 点,紧接着Control Point的核算再介绍。

得到originPointFList, controList后,每次迭代套用Path.cubicTo(controlPoint1, controlPoint2, endPoint) API即可,最终得到 cubicPath.

曲线图底部是渐变Color区域,这儿构建了关闭的Path cubicFillPath, 其间包括了cubicPath。

private void drawCubicFill(RecyclerView parent, Canvas c, List<PointF> pointFList, Path spline, float bottom) {
  spline.lineTo(pointFList.get(pointFList.size() - 1).x, bottom);
  spline.lineTo(pointFList.get(0).x, bottom);
  spline.close();
  drawFilledPath(parent, c, spline);
}

整个主体图表的制作逻辑大致如上,十分简单。

下面是刚提到的关于 Control Point 的核算, 这儿界说了一个类 ControlPoint, 包括两个Control Point点。上面核算controList 办法也就作为 它的static 办法放在ControlPoint 中了。

List<ControlPoint> controlList = ControlPoint.getControlPointList(originPointFList, mBarChartAttrs.bezierIntensity);

其间 bezierIntensity 表明操控贝塞尔曲线曲率强度的一个参数系数。

RecyclerBezierChart图表绘制

对于不是第一个,最终点, 核算公式:

controlPoint.x = cur.x + (next.x – pre.x) * bezierIntensity; Y值同理。

两个鸿沟方位Index 鸿沟的原因稍作变动,详细如下:

RecyclerBezierChart图表绘制

至此曲线图的制作结束,十分简单,最终附上一张RecyclerBezierChart的gif 图。

本专栏到这儿几个常用的图表的纯制作介绍完了,接下来大致两到三章节介绍图表动态相关的逻辑,选中高亮的操控,长按选中滑动跟RecyclerView自身滑动的一个抵触上的解决;操控同一天显示在一屏时的回弹的操控逻辑。