• 0
brunnengi

[Android] Разделить скроллинг и нажатие

Вопросы

Здравствуйте.

-------------

Delphi XE7

-------------

В компонент TVertScrollBox положил несколько Layout'ов. Layout'ы имеют события MouseDown и MouseUp.

При прокручивание списка идет реакция события того layout'а на который пришелся "click" пальцем.

Как сделать так, что бы MouseDown и MouseUp компонентов Tlayout отрабатывались только в том случае, если это не скроллинг, т.е. так, как это сделано во всех приложениях для андройда?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 ответов на этот вопрос

  • 0

событие OnTap пробовали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

событие onTap я использую. Но не всегда нужен именно OnTap.

Например вам требуется смена цвета когда элемент нажат, а когда с элемент отпущен, то цвет надо вернуть назад.

Т.е. надо использовать MouseDown и MouseUp.

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

 

Я не спорю что это абсолютно правильная и ожидаемая реакция. Однако я вижу что в других приложениях это не проблема. Если идет скроллинг, то элементы на которые пришёлся клик не реагируют, а если это именно нажатие, то реагируют.

 

Как такое реализовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Очень актуален, даже события OnClick срабатывает на Button раньше жеста. Не могу допереть никак, если реализовать включение таймера при OnClick а на таймере с интервалом 0,5 сек проверить был ли жест путем проверки переменной, тогда пуск процедуры, конечно на OnGesture переменной присвоит 1. Еще не пробывал, но уверен что есть нормальный способ, а ни трактор как этот.

Кстати читал что событие OnClick в принципе срабатывает раньше чем жест, был прям список что срабатывает раньше, и у разных компонентов разыне очередности, что означает я полагаю, что дело в компоненте, подскажите как изменить компонент например Button, то есть очередность срабатывания процедур в компоненте? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В моём случае спас OnTap, т.к. мне нужно было выбрать пункт в списке, при работающей смене страниц tabcontrol свайпами вправо/влево.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

решал эту проблему через ручное отлавливание координат между MouseDown и MouseUp
элементам внутри контейнера HitTest:=false
если скролл контейнера был - ничего не делать 
если скролла не было - определить по координатам, есть ли объект под пальцем, и запустить, что там надо запускать по клику

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Тоже решал эту проблему через ручное отлавливание координат. Приведу небольшой пример.

 

Есть ComboBox который открывался, если на него поставить палец при скроле.

ComboBox лежит на Layout.

Layout лежит на ScrollBox. А так же имеется ToolBar вверху.

Для начала у ComboBox.Enabled = False;

А потом OnTap Parent компоненты, на которой лежит ComboBox был написан так.

LayoutOnTap(Sender: TObject; const Point: TPointF);
var
  PointComponent : TPointF;
  PixelRegion: TRectF;
begin
    PointComponent := TPointF.Create(ComboBox.Position.X,
                                     ComboBox.Position.Y);
    PixelRegion := TRectF.Create(PointComponent, ComboBox.Width,
                                 ComboBox.Height);
    if PixelRegion.Contains(TPointF.Create(Point.X, Point.Y - ToolBar.Height + ScrollBox.ViewportPosition.Y)) then begin
      ComboBox.DropDown;
      exit;
    end{if};
end{LayoutOnTap};

Для Еdit: 

1) Еdit.ReadOnly := True;

2) EditOnTap(Еdit.ReadOnly := False;);

3) EditOnExit(Еdit.ReadOnly := True;) 

Для DateEdit всё так же как с комбобоксом, только DateEdit.OpenPicker;

 

Возможно это кому-то поможет.

Изменено пользователем umkes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

я эту проблему решал через переписывание обработок событий мышки компонентов. то есть в обычном десктопе нажатие на элемент означает его нажатие. в тачевом это не всегда так. я сделал такой примерно алгоритм - в onMouseDown регистрировал что был выбран элемент, в onMouseMove на сколько далеко после этого двинулись координаты, а onMouseUp обработку, если координаты поменялись более чем на 20 точек то ничего не делать, если координаты не поменялись или поменялись незначительно то вызов процедур какие должны были вызваться в OnMouseDown. Я об этом писал уже и тему создавал, но разработчикам пофигу, для них это не проблема. А для меня было проблемой скролить комбобоксы, вечно они выпадали. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 21.08.2015 в 08:18, krapotkin сказал:

решал эту проблему через ручное отлавливание координат между MouseDown и MouseUp
элементам внутри контейнера HitTest:=false
если скролл контейнера был - ничего не делать 
если скролла не было - определить по координатам, есть ли объект под пальцем, и запустить, что там надо запускать по клику

Добрый день !

Не поделитесь "определить по координатам, есть ли объект под пальцем, и запустить, что там надо запускать по клику" ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

у каждого компонента есть BoundsRect. Нужно просто сравнить, не попадает ли XY в этот rect .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу