Перейти к содержанию
Fire Monkey от А до Я
  • 0

FMX: Скроллинг и нажатия


slav_z

Вопрос

Все разработчики при работе с FMX рано или поздно сталкиваются с одной и той же проблемой: необходимо исключить "случайное" срабатывание нажатий элементов внутри скроллбокса во время его скроллинга. Идут годы, а решения так и нет. Давайте попробуем это исправить. Поехали!

Запускаем IDE, создаем новый проект, кидаем на форму TVertScrollBox и на него чего-нибудь побольше... запускаем на мобильном устройстве, пытаемся скроллировать,

948961889_.thumb.png.b8ef6c5a390b4486174c9bfcb7589fd0.png

получаем проблемы в виде срабатывания разных событий типа OnClick элементов.

Решение состоит в том, чтобы сделать элементы "невидимыми" для событий связанных с действиями пользователя с экраном во время скроллинга.

Делаем следующее:

892700318_.thumb.png.d0a87941115cd53d5977021908779a87.png

Все. Переносим код в базовую форму, делаем его более гибким, убираем все те костыли, которые мы уже успели сделать ранее...

Удачи!

https://github.com/slav-libx/scroll-click.git

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Прошу помощи, как переделать предложенный вариант под следующую конструкцию

Я использую компоненты https://github.com/Zeus64/alcinoe TALTabControl на котором в каждой вкладке создается TALVertScrollBox, то есть у пользователя есть две степени свободы. Изначально я пробовал использовать обычный TVertScrollBox, который положен на TALTabControl, но приведенный код работал только при скролинге скроллбокса, а при горизонтальном свайпе со сменой активного таба нажатие все равно получалось. Вторая проблема в том, что я не до конца понимаю код, а конкретнее, когда я заменяю  TCustomScrollBox на TALVertScrollBox, начинает ругаться на строку if ScrollBox is TCustomListBox then

unit Form.Base;

interface

uses
  System.SysUtils,
  System.Types,
  System.UITypes,
  System.Classes,
  System.Variants,
  FMX.Types,
  FMX.Controls,
  FMX.Forms,
  FMX.Graphics,
  FMX.InertialMovement,
  FMX.Dialogs,
  FMX.Layouts,
  FMX.ListBox;

type
  TBaseForm = class(TForm)
  private
  protected
    ControlledScrollBox: TCustomScrollBox;
    function GetActiveScrollBox: TCustomScrollBox; virtual;
  public
    function ObjectAtPoint(AScreenPoint: TPointF): IControl; override;
  end;

implementation

{$R *.fmx}

type
  TAniCalculationsAccess = class(TAniCalculations);

function ControlMoved(ScrollBox: TCustomScrollBox): Boolean;
begin
  Result:=False;
  if Assigned(ScrollBox) then
  if ScrollBox is TCustomListBox then
    Result:=ScrollBox.AniCalculations.Moved
  else
    Result:=ScrollBox.AniCalculations.Moved and TAniCalculationsAccess(ScrollBox.AniCalculations).Enabled and
      (ScrollBox.AniCalculations.LastTimeCalc>0);
end;

function TBaseForm.GetActiveScrollBox: TCustomScrollBox;
begin
  Result:=ControlledScrollBox;
end;

function TBaseForm.ObjectAtPoint(AScreenPoint: TPointF): IControl;
var ScrollBox: TCustomScrollBox;
begin

  var P:=ScreenToClient(AScreenPoint);

  ScrollBox:=GetActiveScrollBox;

  if ControlMoved(ScrollBox) and ScrollBox.PointInObject(P.X,P.Y) then
  begin
    Result:=ScrollBox;
    if Assigned(Captured) and (Captured<>Result) then
    begin
      Captured.MouseUp(TMouseButton.mbLeft,[],-1,-1);
      SetCaptured(nil);
    end;
  end else
    Result:=inherited;

end;

end.

Прошу, пните в нужном направлении, куда копать

Ссылка на комментарий
  • 0

Все из-за неправильной системы обработки нажатий. В других системах срабатывает нажатие когда было сделано нажатие и без движения было отпущено, тогда сработает событие. В огнеобезьяне срабатывает сразу же после нажатия через какое то время, что не правильно. 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...