Начните касание и закончите касание события Delphi

SuckLips спросил: 28 апреля 2018 в 08:29 в: delphi

Я использую простое приложение для рисования в Delphi FMX для Windows с сенсорным экраном.

Я ищу функцию, которая вызывается непосредственно после первого нажатия на экран и аналогичной функции, вызванной после завершения касания , Очень близко к MouseDown и MouseUp и с помощью TControl.Pressed.

Я пытался использовать функции мыши, но, к сожалению, многие окна сенсорных экранов не отправляют это событие после касания экрана (некоторые из них).

Я также попробовал Tap, но он вызывается, только если вы не перетаскиваете палец на экране.

Наконец, я хотел использовать TGestureManager, но, похоже, он фокусируется только на Жестях, таких как масштабирование, поворот и т. д.

Есть ли какие-либо другой вариант для достижения моей цели?


2 ответа

alitrun ответил: 04 мая 2018 в 02:51

Используйте Gesture manager и жмите Пан (выберите его из раздела Интерактивные жесты в Object Inspector). Затем вы можете получить все подробности о жесте, определить направление и скорость. Панорама жеста возвращает данные сразу после того, как пользователь начал прокручивать пальцем.

Вот пример из моего кода:

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;
SuckLips ответил: 12 мая 2018 в 04:31

Оказывается, что события MouseDown были отправлены, но свойство Pressed TControl в FMX возвращает false, даже если вы касаетесь экрана. Свойство Pressed считывает только кнопки мыши. После реализации свойства myPressed с помощью MouseDown и MouseUp myPressed возвращался true, даже если вы коснулись экрана, а затем удалите его.

coldspeed ответил: 04 мая 2018 в 02:53
Итак, ваш вопрос был решен или нет? Из ответа здесь неясно.
SuckLips ответил: 12 мая 2018 в 04:17
Да, это было решено.
coldspeed ответил: 12 мая 2018 в 04:17
Можете ли вы отредактировать свой ответ, чтобы добавить немного больше ясности? Не похоже, что вы ясно знаете, что вы говорите в своем ответе.
SuckLips ответил: 20 мая 2018 в 09:29
Это теперь ясно?