先说下自己制作虚线的背景:UI设计很别致,找相关第三方没有彻底匹配的(即便有,也不会用,一般不会因一个功能去嵌入一个第三方,只会学习第三方来完成,自己完成的更好保护和扩展,且代码量更小) 。

这次需求的完成是学习fl_chart第三方来完成的,fl_chart供给了许多款式的图表制作,代码复杂度高,不易阅览,感兴趣的能够深入了解这个框架,此次虚线的完成是从fl_chart中提炼出来的,其实中心逻辑很简略,就那么十几行代码,后边依次从里边提取一些中心完成,方便日后能更容易完成自定义图表需求。

虚线制作,首要我们了解实线的制作,然后把实线转换成虚线,所以先有必要了解怎么制作实线

实线的制作代码如图:(效果便是一根蓝色竖线)

Flutter虚线绘制,核心理解两个点

制作实线的代码很简略,虚线能够看作是许多很短的实线制作的,便是许多个子Path构成的,然后履行drawPath。

要点来了,将实线的Path转化成虚线的Path(能够理解为把实线Path转换成有距离的多个子Path),然后进行虚线制作,代码里每个子Path长度是4,距离是2,代码如图:

Flutter虚线绘制,核心理解两个点

虚线Path转换的中心,需求理解下面两个代码:

1、path.computeMetrics(),获取Path的概括。

2、metric.extractPath(distance, distance +dottedLength),从概括中获取裁剪出子Path。

裁剪出的子Path经过targetPath.addPath进行添加,然后进行canvas.drawPath就OK了,了解到这个中心逻辑,虚线的完成就很简略了。

留意:任何形状的虚线制作,你都能够先完成相对应的实线Path,然后经过_convertDotterPath方法来进行转换

⚠️ 有些资料用ListView来完成虚线,能完成一些简略的虚线定制,但不引荐。