FireMonkey 使用 tPath 绘图无法填充形状

问题描述 投票:0回答:3

我想使用 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;

当执行此代码时,正如预期的那样,会渲染一个菱形,但它不会用第一个命令中设置的颜色填充。有人知道出了什么问题吗?谢谢。

drawing firemonkey shapes
3个回答
1
投票

这是正确的代码。您可以在 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;

1
投票

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

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;

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


0
投票

遵循有效的代码(就我而言):

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;
语句,以清除点数组中剩余的内容。希望这对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.