开始触摸并完成触摸事件Delphi

时间:2018-05-22 10:09:17

标签: delphi touch firemonkey

我在带有触摸屏的Windows PC的Delphi FMX中实现了简单的绘画应用程序。

我正在寻找一个在屏幕上第一次触摸后直接调用的函数,并在完成触摸后调用类似的函数。非常接近 MouseDown MouseUp 并使用 TControl.Pressed

我尝试使用鼠标功能但不幸的是,许多Windows触摸屏在触摸屏幕后都没有发送此事件(其中一些是这样做的)。

我还尝试了点按功能,但只有在屏幕上没有拖动手指时才会调用它。

最后,我想使用 TGestureManager ,但似乎只关注缩放,旋转等手势。

还有其他选择来实现我的目标吗?

2 个答案:

答案 0 :(得分:2)

使用手势管理器并捕获平移手势(从对象检查器中的交互式手势部分选择它)。然后,您可以获得有关手势,检测方向和速度的所有详细信息。用户开始用手指轻扫后立即平移手势返回数据。

以下是我的代码中的示例:

procedure TfrmMain.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo;
  var Handled: Boolean);

var
  lTouchDirection: TTouchDirection;

  procedure GestureBegin;
  begin
    fGestureHandled := false;
    fSlideStartPos := EventInfo.Location;
  end;

  procedure GestureContinue;
  var
    dX, dY: Single;
  begin
    if fGestureHandled then exit;

    dX := EventInfo.Location.X - fSlideStartPos.X;
    dY := EventInfo.Location.Y - fSlideStartPos.Y;

    if (Abs(dX) < 1) and (Abs(dY) < 1) then  Exit;
    if lTouchDirection = TTouchDirection.tdNone then
    begin
      if Abs(dX) > Abs(dY) then
      begin  // horizontal
        if dX > 0 then
          lTouchDirection := TTouchDirection.tdRight
        else
          lTouchDirection := TTouchDirection.tdLeft;
      end
      else // vertical
      begin
        if dY > 0 then
          lTouchDirection := TTouchDirection.tdDown
        else
          lTouchDirection := TTouchDirection.tdUp;
      end;
    end;
  end;

  procedure GestureEnd;
  begin
    fGestureHandled := false;
  end;

begin
  Handled := true;
  if Touch.InteractiveGestures = [] then exit;
  lTouchDirection := TTouchDirection.tdNone;

  if EventInfo.Flags = [TInteractiveGestureFlag.gfBegin] then
    GestureBegin;

  if EventInfo.Flags = [] then
    GestureContinue;

  if EventInfo.Flags = [TInteractiveGestureFlag.gfEnd] then
    GestureEnd;


end;

答案 1 :(得分:0)

事实证明 MouseDown 事件已发送,但即使您正在触摸屏幕,FMX中TControl的按下属性也会返回false。 Pressed属性只读取鼠标按钮。通过 MouseDown MouseUp 实施 myPressed 属性后,即使您触摸屏幕然后取消触摸,myPressed也会返回true。