3

我正在使用 Delphi XE5 为 Android(和 iOS)开发。

使用 Delphi XE5 中 Touch 属性中的 InteractiveGestures,我可以获得缩放、平移、旋转、TwoFingerTap、PressAndTap、LongTap 和 DoubleTap 的 GestureEvent。所有这些都带有一个 TGestureEventInfo 对象,我可以在其中获取事件的位置,例如。手指的坐标。

但是,似乎没有一个手势只是简单的点击/按下。我知道在这种情况下会触发 OnClick 事件,但 OnClick 事件没有附带 TGestureEventInfo 对象,因此我无法获取点击的位置。这似乎是一个获取信息的非常重要的事件。

我错过了什么吗?如何获取简单的点击手势的位置?

4

1 回答 1

6

使用 OnMouseDown/Up 事件:

procedure TForm17.Button1MouseDown(Sender: TObject; Button: TMouseButton; 
                                   Shift: TShiftState; X, Y: Single);
begin

end;

看到你得到 X 和 Y 坐标。

procedure TForm17.Button1Click(Sender: TObject);
begin

end;

但是,使用 OnClick,您将一无所获。

请注意, OnClick在控件内的 MouseDown
同一控件内的 MouseUp 之后触发,没有任何其他 MouseUp 或 Down。如果您想要与 OnClick 具有相同的行为,您应该检查这一点。

如果您在按钮内部单击并在释放单击之前移到按钮外部,则不应将其注册为click.

为什么 OnClick 不给出坐标
FireMonkey 中的 OnClick 与 VCL 中的 OnClick 相同。
OnClick 是 OnMouseDown 和 OnMouseUp 的总和,因此没有发生点击的地方,因为 VCL 不想在 Down 或 Up 坐标之间进行选择。

我建议
在 OnClick 事件上触发,但在 MouseDown 中注册坐标。

procedure TForm17.Button1MouseDown(Sender: TObject; Button: TMouseButton; 
                                   Shift: TShiftState; X, Y: Single);
begin
  ClickGestureInfo.GestureID:= somethingNotAlreadyInUse;
  ClickGestureInfo.Location:= Point(x,y);
end;

function ClearGestureInfo: TGestureEventInfo;
begin
  FillChar(Result, SizeOf(Result), #0);
end;

procedure TForm17.Button1Click(Sender: TObject);
begin
  if ClickGestureInfo.GestureID = somethingNotAlreadyInUse then begin
    //do stuff
    ClickGestureInfo:= ClearGestureInfo; 
  end;
end;

记录 OnMouseUp 坐标通常没有任何用处,因为只有当 MouseDown 和 MouseUp 位于空间附近时,单击才是单击。

于 2013-10-04T18:22:21.177 回答