本文整理自网络,侵删。
小提示:将文本转换为路径以使FMX中的文本呈现更加生动有趣
FMX中的文本呈现使您可以通过调用TCanvas.FillText方法来绘制文本。但是,渲染的文本非常纯净,没有利用渐变或位图填充的优势,而是完全忽略了笔触属性:
在上面的屏幕截图中,我通过从TText对象(中间)复制字体和从TRectangle(底部)复制Gradient Fill和Stroke属性,在TPaintBox(顶部)中进行绘制。TText填充文本输出为黑色(底部),TPantBox(顶部)输出暗淡的实心“ Hello World !!!”。文本:procedure TfrmFancyText.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);begin Canvas.Font.Assign( Text1.TextSettings.Font ); Canvas.Fill := Rectangle1.Fill; Canvas.Stroke.Assign( Rectangle1.Stroke ); Canvas.FillText(PaintBox1.ClipRect, 'Hello World!!!', False, 1, [], TTextAlign.Center );end;
幸运的是,FMX库使我们只需做一些工作就可以使我们的文字更加生动有趣。通过使用TTextLayout类将文本转换为路径,我们可以对文本路径进行任何想要的操作,包括填充和描边。
彩色文本截图。请注意,顶部文本的填充和轮廓都具有渐变
TTextLayout.ConvertToPath方法使用您指定的字体对象将任何文本转换为路径。要将文本转换为路径,首先需要创建TTextLayout和TPathData对象。然后,您需要为文本分配所需的字体,要转换的文本,最后调用ConvertToPath方法。拥有路径数据后,就可以使用它进行任何操作。procedure TfrmFancyText.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);var TextLayout: TTextLayout; TextPath: TPathData;begin Canvas.Fill := Rectangle1.Fill; Canvas.Stroke.Assign( Rectangle1.Stroke );
TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextPath := TPathData.Create; try TextLayout.Font := Text1.TextSettings.Font; TextLayout.Text := 'Hello World!!!'; TextLayout.ConvertToPath(TextPath); Canvas.FillPath(TextPath, 1); Canvas.DrawPath(TextPath, 1); finally TextPath.Free; end; finally TextLayout.Free; end;end;将文本转换为路径存在一些问题。第一个问题是,没有一点矩阵数学就无法将路径文本放置在所需的任何位置??如果您在上面的第二个屏幕截图中注意到,则渐变填充的Hello World在左上方。这是因为创建的路径基于0、0点,并且TCanvas会在任何路径点处绘制路径。要移动路径,您需要创建一个转换矩阵并将其应用于TPathData或临时设置TCanvas.Matrix属性: [...] TextLayout.ConvertToPath(TextPath); TextPath.ApplyMatrix(TMatrix.CreateTranslation(100,50)); Canvas.FillPath(TextPath, 1); Canvas.DrawPath(TextPath, 1); [...]下一个问题,也许对于某些人来说,最大的问题是,不是所有的FMX Canvas对象都支持ConvertToPath方法。 ConvertToPath方法的GPU Canvas(即FMX.Types.GlobalUseGPUCanvas:= True)实现为空! (更新2016/01/26:Delphi FMX GPU画布的早期版本不支持ConvertToPath;至少从XE8开始受支持)
最后,ConvertToPath方法不支持所有字体样式,特别是fsUnderline和fsStrikeOut。这两种样式将被忽略,并且该行将不会转换为路径。但是对我来说,所有这些都是小麻烦,并且能够将文本转换为路径而无需进行大量工作就非常酷。如您所见,它还使我们能够绕过FMX中文本呈现的限制。我希望这个小技巧对您有所帮助。
相关阅读 >>
Delphi里的compile和build都能产生可执行文件,有什么区别啊?
更多相关阅读请进入《Delphi》频道 >>