Delphi FMX输出彩色文本


本文整理自网络,侵删。

 
小提示:将文本转换为路径以使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中隐藏程序进程

Delphi 与 c# 生成不带bom的utf8文件

Delphi里的compile和build都能产生可执行文件,有什么区别啊?

Delphi 内进行音量控制及静音

Delphi 去掉twebbrowser的滚动条

Delphi memo1 字符串快速查找定位2

Delphi获取文件大小

Delphi的控制台程式添加公司信息、版权信息

Delphi 7 中dbgrid的排序

Delphi memo 循环往上往下滚动

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...