我需要显示长文本,这将占用几个屏幕/页面。我还必须添加一些特性,所以我想实现我自己的文本显示组件。
我找到了与此任务对应的两个类:
>
段落
为文本使用队列,为它们使用样式
使用Canvas.draw段落(段落,偏移量)进行绘画
它们有什么区别,用哪个?!
如果文本包含100行,并且一页上只能放置10行,那么如何在下一页上绘制截断的文本,直到什么都不剩?
tl; dr: imoTextPainter
我创建了一个简单的示例应用程序来比较textpainer
和段落
在Canvas
(属于CustomPainter
)上呈现文本的方法。这两种方法都非常好,都使用不同的方法,都有其奇怪的抖动。
首先我想说的是,textpainer
界面似乎更简单——至少对我来说是这样。您只需将text
指定为TextSpan
条目或树,而且-奇怪的是,它不是默认值-textDirection
。您还可以提供选项,例如maxLines
、style
和textAlign
(以及其他一些选项)。然后您需要使用layout
来指定渲染的布局方式(仅限maxWidth
)。最后,在特定的
画布上以指定的
偏移量
绘制
。
final TextPainter textPainter = TextPainter(
text: TextSpan(text: text, style: style),
textAlign: TextAlign.justify,
textDirection: TextDirection.ltr
)
..layout(maxWidth: size.width - 12.0 - 12.0);
textPainter.paint(canvas, const Offset(12.0, 36.0));
Used
TextSpan
在flatter中非常普遍-RichText
和其他小部件也使用这个类。我还必须注意,使用textpainer
可以检查文本的高度
和宽度
(在渲染之前)。
第二:<代码>段落
。这似乎是更基本的程序方法。正如您在下面看到的,段落
方法不太干净。首先,您必须使用段落构建器
(因为段落
没有构造函数)。您需要用包含各种文本样式(如字体信息、文本对齐、maxLines等)的段落样式
来填充它。然后,您可以使用pushStyle
、pop
和addText
来准备段落的下一部分和下一部分。在构建之后,您可以在Canvas上获得段落。
final ui.ParagraphBuilder paragraphBuilder = ui.ParagraphBuilder(
ui.ParagraphStyle(
fontSize: style.fontSize,
fontFamily: style.fontFamily,
fontStyle: style.fontStyle,
fontWeight: style.fontWeight,
textAlign: TextAlign.justify,
)
)
..pushStyle(style.getTextStyle())
..addText(text);
final ui.Paragraph paragraph = paragraphBuilder.build()
..layout(ui.ParagraphConstraints(width: size.width - 12.0 - 12.0));
canvas.drawParagraph(paragraph, const Offset(12.0, 36.0));
请注意,有两种类型的
TextStyle
(Dart用户界面和颤振)。与pushStyle
一致,您可以看到颤振绘画库TextStyle
已转换为Dart UITextStyle
。另一件奇怪的事情是,您可以/需要仅在ParagraphBuilder
中指定一些字体设置,即使您将在后面的行中使用pushStyle
。而布局
必须指定宽度
。
我认为我可以更好地用于读取文件,尤其是格式化,因为不需要将文件解析为
TextSpan
tree,这可能会很昂贵。如果你知道自己在做什么,我想它也比其他方法快一点,但我没有时间深入挖掘。
当文本太多时,您可能想要剪辑文本。两个
段落
和TextPainter
公开maxLines
-设置最大行-和didExceedMaxLines
-检测是否超过限制-,以这样或那样的方式。还有canvas.clipRect
和相关方法,允许将所有绘图剪辑到选定的空间。
还有一个简单的性能测试(发布时),它表明这两种方法是可比较的(在我的测试案例中,
textpainer
比段落
快不超过2%)。也可能是测量误差’\_(ツ)_/¯.
第二页是新页....这是整个一段。我有段落的起始坐标。
我试图使用APACHE POI创建一个段落,其中包含左边的图像和右边的一些文本。有什么方法可以设置这两个组件之间的对齐方式吗? 下面是在表中执行我想要的操作的代码,但它也呈现了这两个段落。 提前谢谢你。
我有一个JavaFX应用程序,我在画布上画画。绘图跟随鼠标。此移动有点滞后,因为渲染需要一些时间。到目前为止还可以。但当我停止鼠标时,它的坐标有时仍处于旧位置。 以下代码再现了该问题: 当您快速移动鼠标并突然停止时,圆圈有时不在鼠标下方。 我玩过使用或不使用平台。runLater()或调用顺序。没有成功。 编辑:我无法在Windows下重现这种行为。
我被告知,当用汇流维基页面编辑时,预格式化样式和段落样式之间的区别是 预格式化在复制和粘贴时保持原点的样式,而段落不是。 然而,当我测试它时,段落做了同样的事情。有人知道这两者的区别吗?我做了一些谷歌搜索,但似乎没有找到答案。
更改画笔大小和钢笔压力的不透明度 如果您使用图形绘制绘图板(例如 Wacom® 绘图板),则可以通过钢笔压力、角度、旋转或光笔轮来控制绘画工具。 选择“画笔”、“铅笔” 或其他绘画工具。 在选项栏中,执行下列某个操作: 单击“绘图板压力控制大小”按钮。 单击“绘图板压力控制不透明度”按钮。 注意:选取“窗口”>“画笔”可访问根据钢笔压力而改变角度、流量、散布程度、纹理深度以及描边圆度的其他控制选项
原则 一个段落只能有一个主题,或一个中心句子。 段落的中心句子放在段首,对全段内容进行概述。后面陈述的句子为核心句服务。 一个段落的长度不能超过七行,最佳段落长度小于等于四行。 段落的句子语气要使用陈述和肯定语气,避免使用感叹语气。 段落之间使用一个空行隔开。 段落开头不要留出空白字符。 引用 引用第三方内容时,应注明出处。 One man’s constant is another man’s