粗细 > 1 的线条在 Windows 和 Android 上的绘制方式似乎有所不同。我使用的是德尔福11.0。创建一个空白的多平台应用程序并在 FormPaint 事件中添加以下内容。
procedure TMainForm.FormPaint(Sender: TObject; Canvas: TCanvas;
const ARect: TRectF);
begin
Canvas.Stroke.Thickness := 20;
Canvas.Stroke.Cap := TStrokeCap.Round;
Canvas.Stroke.Color := TAlphaColorRec.Red;
Canvas.Stroke.Kind := TBrushKind.Solid;
Canvas.DrawLine(PointF(20,20), PointF(70,70), 1);
Canvas.DrawLine(PointF(70,70), PointF(130,70), 1);
end;
Run Code Online (Sandbox Code Playgroud)
这导致以下结果。在 TImage 上绘图时也会发生同样的情况。
在 Windows 中,线条的端点似乎位于线帽的中心,而在 Android 上,它们位于线帽的末端。我正在运行 Android 8.0.0 的华为 P10 上进行测试。我目前无法在更新的 Android 版本上进行测试。谷歌搜索似乎没有给出关于这个问题的任何结果。如果有人有关于此问题的任何信息以及可以采取什么措施,我将不胜感激?如果有人可以在更新的 Android 版本上对此进行测试,我们也将不胜感激。我当然可以为 Android 添加特殊代码,将线条端点延长一半的线条粗细,但如果可能的话,我想避免这种情况。
Android 文档似乎暗示它不应该有这样的行为。 https://developer.android.com/reference/android/graphics/Paint.Cap
Windows 和 Android 之间的主要区别在于它们使用不同的 TCanvas 实现。Windows 使用 TCanvasD2D,而 Android 使用 TCanvasGpu。查看Delphi代码。我想知道 FMX.StrokeBuilder.pas 中的以下代码是否导致了该问题。此代码从 FMX.Canvas.GPU.pas 运行,即使使用 TStrokeDash.Solid 也是如此。我不明白为什么它会这样抵消末端。
procedure TStrokeBuilder.InsertDash(SrcPos, DestPos: …Run Code Online (Sandbox Code Playgroud) 这是我创建的一个类,用于将 TLabel 添加到 TTrackBar。标签显示拖动时轨迹栏的值,然后淡出。在运行时创建一个实例,并将父对象设置为表单。它工作正常,但如果轨迹栏仍然存在,则在应用程序关闭时会出现错误。但是,如果在运行时释放轨迹栏然后关闭应用程序,则没有问题。在应用程序关闭时调试该行 (FLabel.Free;) 我看到 FLabel 和其中的数据仍然存在,但它仍然给出该错误。我担心如果我只是删除该行,那么在运行时释放对象时会出现内存泄漏。我尝试将其更改为 if Assigned(FLabel) then FLabel.Free; 但没有变化。我知道这一定与标签的父级已设置这一事实有关。
unit TrackBarLabelUnit;
interface
uses
System.Types, System.Classes, System.SysUtils, FMX.Types, FMX.StdCtrls,
FMX.Controls;
type
TValueToString = function(AValue : Single) : String of object;
TTrackBarLabel = class(TTrackBar)
private
FLabel : TLabel;
FSuffix : String;
FTimer : TTimer;
FOffset : Integer;
FValueToString : TValueToString;
procedure TimerTimer(Sender: TObject);
protected
procedure ParentChanged; override;
procedure DoTracking; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Suffix : String read FSuffix write FSuffix;
property LabelOffset …Run Code Online (Sandbox Code Playgroud)