fluttercandies / extended_text

A powerful extended official text for Flutter, which supports Speical Text(Image,@somebody), Custom Background, Custom overFlow, Text Selection.
MIT License
664 stars 134 forks source link

[Feature] 能不能加入一个最简单的一行排满再换行的规则 #85

Closed sweatfryash closed 4 years ago

sweatfryash commented 4 years ago

使用Text(),或者ExtendedText()时,类似ADASDAS-123SFDASE1-SDA12EQW12这种字符串(常见于很长的编号),会在一行没有铺满时换行,实际上在中文语境并没有这种智能换行的需求。如下图效果 BMGKeg.png 虽然我可以自己一行一行绘制但太简陋了,而且项目里已经大量使用了ExtendedText,所以请问能作为一个功能添加吗,或者我可以结合ExtendedText实现这个效果吗该如何做。 因为我不了解ExtendedText的源代码所以只能提出这个问题不能给出具体的代码上的建议。 以下是我自己写的换行的函数,质量不是太好,按照最简单的思路写的。分行之后然后就用canvas一行一行画。

lineBreak ```dart List _lineBreak(double width) { List res = []; ParagraphBuilder paragraphBuilder = ParagraphBuilder(ParagraphStyle()); ParagraphConstraints paragraphConstraints = ParagraphConstraints(width: width); String tempStr = text; while(tempStr.isNotEmpty){ paragraphBuilder.pushStyle(ui.TextStyle( color: style.color,fontSize: style.fontSize,fontWeight: style.fontWeight,fontFamily: style.fontFamily)); double lastWidth = width; //一行的剩余宽度 StringBuffer tempBuffer = StringBuffer(); while(lastWidth >= 0){ //一个字一个字的循环,我也不懂有没有更好的办法 if(tempStr.isEmpty){ break; } String firstStr = tempStr.substring(0,1); tempStr = tempStr.replaceFirst(RegExp(r'.'), ''); double firstStrWidth = calculateTextWidth(firstStr, width); if(lastWidth > firstStrWidth){ tempBuffer.write(firstStr); lastWidth -= firstStrWidth; } else { break; } } paragraphBuilder.addText(tempBuffer.toString()); //得到一行 Paragraph paragraph = paragraphBuilder.build()..layout(paragraphConstraints); res.add(paragraph); paragraphBuilder.pop(); } return res; } ```