Начните сенсорный и закончить сенсорный событие Delphi - PullRequest
0 голосов
/ 22 мая 2018

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

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

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

Я также пытался Нажать функцию, но она вызывается, только если вы не проводите пальцем по экрану.

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

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

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

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

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

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;
0 голосов
/ 22 мая 2018

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

...