讲完画布基本的一些属性之后,我们开始绘画图表内容区吧。首先是绘画坐标轴,坐标轴分为 X 轴跟 Y 轴,我们要先开始画 Y 轴,为什么?因为我已经帮大家踩坑了,原因是:y 轴上要显示文本标签,如果一开始没有得到文本标签对应的宽度最大值,那么 Y 轴跟 X 轴的起点坐标就会有偏差,会导致绘画全部错位。我先给大家看完整的坐标轴的效果
我用了一个 500\*500 的矩形作为我们这次的画布,我们可以图上看到 Y 轴整体包含了文本标签、Y 轴线、分割线、刻度线四个部分。了解 canvas 的都知道,canvas 绘画基本都是通过坐标来定位的,而我们 Y 轴整体的四个部分的起点与结束坐标都是互相有关系,甚至需要把内部间距、分割间距、y 轴线高度、文本最大的宽度四个属性计算在内。讲了这么久概念与思路,还没开始讲代码,真的是不好意思。接下来我们一一的讲解:
1、计算得到文本最长宽度(maxNameW ),我们可以从图中看到,不管是 y 轴线、刻度线、分割线的起点坐标都是需要内容间距、文本标签、文本标签与分割线间隔(可有可无,看你自己)相加计算得到,而为了保持对齐,所以我们需要计算出文本最长宽度。而 y 轴的文本一般都是数据(data)对应的数值,所以我们需要得到传入数据(data)中的最大值。然后讲最大值分割成五等分(这里是我们固定写死了,后续可以自行改成动态的)。以下就是计算获取最大文本宽度的代码,部分逻辑我也会写在代码上,请仔细看代码哦:
3、绘画刻度线。我们可以从概念图得到,刻度线的起点 x 坐标算法是:内部间距(cSpace)加最长文本宽度(maxNameW )加上文本与刻度线的间距(这点我没有特地画出来,可以看自己业务),起点 y 坐标则跟文本一样,通过分割间距与下角标的关系得到每个刻度的 y 坐标;而终点 x 坐标则是刻度线的长度,终点 y 坐标则跟起点的 y 坐标一样,我设置默认长度是 5,这样就能得到我们的刻度线了。代码如下:
4、绘画 y 轴线。接着就是我们的 y 轴线了,继续分析概览图。从图中我们可以得到:y 轴线的起点 x 坐标的算法是:内部间距(cSpace)加最长文本宽度(maxNameW )加上文本与刻度线的间距以及刻度线长度,起点 y 坐标则是内部上间距;而终点 x 坐标跟起点 x 坐标一样,终点 y 坐标算法是:画布高度减去上下两边的内部间距。通过以上计算关系就能绘画出 y 轴线了。代码如下:
1. 最长对象不一样。Y 轴最长是文本宽度;而 X 轴需要获取的最长是文本高度。
2. 间隔分割数不一样。Y 轴是自定义的分割数;而 X 轴分割线是实际数据的长度。
3. 分割间距长度算法不一样。Y 轴算法是用数据最大值处于自定义的分割数;而 X 轴算法是用画布宽度减去(左右两边的内部间隙以及 Y 轴宽度(文本最长宽度加上刻度线宽度)),再除去数据的长度,得到每个间隔的长度。
从上面的图可以看出折线直接就是把实际数据的数值转成 x 跟 y 坐标,再通过连线连接起来。而每一个转折点的 x 坐标算法跟 x 轴的刻度或者文本是一样的,而 y 坐标是实际数值通过一定算法转成我们需要的高度。x 坐标我们已经获取了,只要是攻克我们的 y 坐标即可。我们可以通过图来观察一下在画布中与实际数据的关系: