使用 tPath 的 FireMonkey 绘图不填充形状

FireMonkey drawing with tPath does not fill the shape

我想使用 TPathData 绘制形状并用任意颜色填充它们。我在 Button1Click 处使用了以下代码,这是我从 Embarcadero 文档中的示例中提取的:

procedure TformPathDrawing.Button1Click(Sender: TObject);
var path: TPathData;
begin
  Image1.Bitmap.Canvas.Fill.Color := TAlphaColorRec.Blue;
  path      := TPathData.Create;
  path.Data := 'M 01,00 L 02,01 L 01,02 L 00,01 L 01,00';
  Image1.Bitmap.Clear ($FFFFFF);
  Image1.Bitmap.Canvas.BeginScene;
  Image1.Bitmap.Canvas.FillPath (path, 200);
  Image1.Bitmap.Canvas.EndScene;
end;

当执行这段代码时,正如预期的那样,一个 romboid 被渲染,但它没有填充第一个命令中设置的颜色。任何人都知道什么是错的?谢谢

因为评论不能有代码(至少不能格式化)。这是我的代码,有效。

procedure TForm7.RadioButton6Click(Sender: TObject);
var path: TPathData;
begin
  Image1.Bitmap.Canvas.Fill.Color := TAlphaColorRec.Blue;
  Image1.Bitmap.Canvas.Stroke.Color := TAlphaColorRec.black;
  path      := TPathData.Create;
  try
    path.Data := 'M 01,00 L 20,01 L 10,20 L 00,10 L 01,00';
    Image1.Bitmap.Clear ($FFFFFF);
    Image1.Bitmap.Canvas.BeginScene;
    Image1.Bitmap.Canvas.FillPath (path, 200);
    Image1.Bitmap.Canvas.EndScene;
  finally
    path.Free;
  end;
end;

请注意,描边颜色也已设置。这是我在这里唯一能看出的区别。

这是正确的代码。您可以在 FMX.Objects.pas 过程 TCustomPath.UpdateCurrent 和其他中找到其他详细信息;或者只是调试 TPath 可视化组件。

     {aPath - is vector path of image;
     aStretch - how to draw vector data - true - stretch draw, false = fit to bitmap
     aBitmap - must be created. In bitmap you should specify:
     Width, Height, Bitmap.Canvas.Fill.Color, Bitmap.Canvas.Stroke.Color
     and, if you need, another drawing stuff like Gradient, stroke thikness, 
     background texture) }

procedure TForm1.DrawVectorPath(const aPath: string; aBitmap: TBitmap; aStretch: boolean);
var
  vPath: TPathData;
  R: TRectF;
begin
  Assert(aBitmap <> nil);
  vPath := TPathData.Create;
  try
    vPath.Data := aPath;
    aBitmap.Clear($FFFFFF);
    if aStretch then
    begin
      R := vPath.GetBounds;
      vPath.Translate(-R.Left, -R.Top);
      vPath.Scale(aBitmap.Width / R.Width, aBitmap.Height / R.Height);
    end
    else // Fit image
    begin
      R := TRect.Create(0, 0, aBitmap.Width, aBitmap.Height);
      vPath.FitToRect(R);
    end;

    aBitmap.Canvas.BeginScene;
    aBitmap.Canvas.FillPath(vPath, 1);
    aBitmap.Canvas.DrawPath(vPath, 1);
    aBitmap.Canvas.EndScene;
  finally
    vPath.Free;
  end;
end;

遵循有效的代码(在我的例子中):

procedure TformPathDrawing.Button1Click(Sender: TObject);
begin
Image1.Bitmap.Canvas.Fill.Color := TAlphaColorRec.Blue;
path.Clear;
path.Data := 'M 01,00 L 02,01 L 01,02 L 00,01 L 01,00';
Image1.Bitmap.Canvas.BeginScene;
Image1.Bitmap.Canvas.FillPath (path, 1);
Image1.Bitmap.Canvas.EndScene;
end;

在我的代码中,变量path是在绘画代码之外创建的。由于 path.Data; 是可加的,因此必须在添加当前 path.Data; 之前放置一个 path.Clear; 语句,以清除点数组中剩余的任何内容。希望这对其他人有帮助。