Delphi FMX输出彩色文本

小提示:将文本转换为路径以使FMX中的文本呈现更加生动有趣
FMX中的文本呈现使您可以通过调用TCanvas.FillText方法来绘制文本。但是,渲染的文本非常纯净,没有利用渐变或位图填充的优势,而是完全忽略了笔触属性:
图片[1]-Delphi FMX输出彩色文本-Delphi编程技巧大全
在上面的屏幕截图中,我通过从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类将文本转换为路径,我们可以对文本路径进行任何想要的操作,包括填充和描边。
图片[2]-Delphi FMX输出彩色文本-Delphi编程技巧大全
彩色文本截图。请注意,顶部文本的填充和轮廓都具有渐变
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中文本呈现的限制。我希望这个小技巧对您有所帮助。
THE END
文章版权归作者所有,未经允许请勿转载。
点赞8赞赏
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片