我有一个纸牌游戏,我使用 IFMXDragDropService 将一系列纸牌从一个堆栈拖动到另一个堆栈。我更喜欢非半透明的拖动图像(this VCL 解决方案在 FMX 中不起作用),但除此之外它可以满足我的要求,直到卡运行足够长以至于拖动图像高度 >300。从那时起,拖动图像透明度具有 x 轴渐变效果。
可以使用具有 2 个 TImage 控件的表单看到效果,其中一个控件的高度为 <=300 and the other >300。 (宽度 >300 也会产生 x 轴效果。)将匹配大小的 PNG 加载到表单的 Create 事件中的每个 TImage.Bitmap 属性中。将以下代码分配给每个 TImage 的 OnMouseDown 事件:
procedure TFormFMXDrag.ImgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
X, Y: Single);
var
Svc: IFMXDragDropService;
DragData: TDragObject;
DragImage: TBitmap;
begin
if TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, Svc) then
begin
DragImage := TBitmap.Create;
try
DragImage.Assign(TImage(Sender).Bitmap);
DragData.Source := Sender;
Svc.BeginDragDrop(FormFMXDrag, DragData, DragImage);
finally
DragImage.Free;
end;
end;
end;
DragImage.Height 300 DragImage.Height 301
创建图像的方式并不重要。我尝试过 MakeScreenShot、PaintTo 并在设计时将 PNG 加载到 MultiResBitmap 属性中。最大不透明度的垂直线落在的位置不一致。每次开始拖动时它都会改变。
我哪里错了? 我担心解决方案将意味着实现我自己的拖放服务......我从未这样做过。我在 FMX 中完成了此操作,因此如果我决定瞄准其他平台,则不必从头开始,但目前唯一的计划是 Windows。