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

Наложение скролбоксов


dreamix

Вопрос

День добрый, господа!

Пытаюсь реализовать довольно простую вещь с точки зрения функциональности интерфейса для мобильных устройств. А именно:
В вертикально прокручиваемом блоке расположить блоки с горизонтальной прокруткой содержимого. Примерно как сейчас это выглядит в Гугл Плей.
Но получается некоторая фигня, так как внутренние блоки (с горизонтальной прокруткой) перекрывают вертикальную прокрутку родителя.
Причем когда начинаешь играться со свойствами скролбоксов, от результата немного мозг подтекает


Пробовал различные варианты комбинаций свойств HitTest и igiPan (стоит по умолчанию) для внутренних скролов.
Поведение несколько меняется (в том числе и где происходит касание внутри скролов - на объектах или на пустом месте), но необходимый эффект не достигается.

Самый дельный вариант получается если передавать изменение Y-координат в событии OnGesture igiPan на объектах (!) внутри скроллов и переносить их на Viewport вертикального скролла. Но в таком случае не работает AniCalculations. При некоторых вариантах можно также  выставить HitTest - Fasle объектам внутри горизонтальных скроллов. Скроллы  начинают работать, но тогда теряется доступ к объектам.

https://cloud.mail.ru/public/BYZ7/w957wUHEN

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

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

  • 0

Терпение... Zuby пишет компонент на основе TListView, как раз, то что тебе надо Вертикальный скролбокс и внутри горизонтальные ListView, наверное завтра выложит  :)

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

Хорошо, подождём)
А сам компонент где можно будет найти?

А вообще передача касаний и вычисление прокрутки между объектами как-нибудь решается?

Пробовал отключать Pan для внутренних скроллов по событиям TAniClaculations.OnStart
Оно срабатывает, но пока палец не отпустишь - эффекта не дает.

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

 

Уже выложил, вот тут

Большое спасибо, Работает именно так как нужно!

Только можно меня мордой тыкнуть в основную идею сквозного скроллинга?

 

идея такова чтобы нижнему контролу (скролбоксу) передать координаты смещения.

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

используются жесты, событие

procedure TFormGP.ListView1Gesture(Sender: TObject; const [Ref] EventInfo: TGestureEventInfo; var Handled: Boolean);
Ссылка на комментарий
  • 0

Ясно) буду разбираться.

Я просто просто пробовал сам TListViewHorz и искал непосредственно в функциях компонента, потому что вроде как и без Gesture работало


UPD

Убрал TFormGP.ListView1Gesture Скроллинг работает точно также.
Сама процедура, кстати похожа на ту, о которой я писал в первом сообщении в теме, как о дельном варианте, но без AniCalculations.
Поэтому "сквозной скроллинг" где-то в компоненте реализуется. Пока не разобрался (((

Изменено пользователем dreamix
Ссылка на комментарий
  • 0
  • Модераторы

Ясно) буду разбираться.

Я просто просто пробовал сам TListViewHorz и искал непосредственно в функциях компонента, потому что вроде как и без Gesture работало

UPD

Убрал TFormGP.ListView1Gesture Скроллинг работает точно также.

Сама процедура, кстати похожа на ту, о которой я писал в первом сообщении в теме, как о дельном варианте, но без AniCalculations.

Поэтому "сквозной скроллинг" где-то в компоненте реализуется. Пока не разобрался (((

так отключите TouchTracking у PresentedScrollBox, он перехватывает жесты

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

Если по примеру GPStyle

Вариант 1. Изначальный:
Горизонтальный скроллинг работает. вертикальный работает

Вариант 2. Без TFormGP.ListView1Gesture
Горизонтальный скроллинг работает. Вертикальный работает. Т.е нет никакой разницы с вариантом 1

Вариант 3. С TFormGP.ListView1Gesture, и отключенным TouchTracking у PresentedScrollBox (Родитель)
Горизонтальный скроллинг работает. Вертикальный не работает.

Мне то как раз нужно чтобы оба скроллинга крутились (с инертными движениями). Оно и работает, но только конкретно с этим компонентом.
Вот я и хочу понять - где и почему. Чтобы попробовать на других компонентах со скроллингом.

Изменено пользователем dreamix
Ссылка на комментарий
  • 0

У меня некоторые подвижки.
Еще раз отмечу что это на Seattle без апдейтов. И тестил только на андроиде.

1. Внутренний и сквозной) скроллинг работает и для обычного вертикального TListView. Но поведение у них не очень удобное.

2. Внутренний и сквозной скроллинг работает для TListBox.
Для этого ему нужно убрать Pan в InteractiveGestures.
А если поставить ListStyle = Horizontal, то можно приспособить под горизонтальный скроллер.

 

3.И я придумал как сделать сквозной скроллинг для THorzScrollBox
- Надо убрать Pan в InteractiveGestures THorzScrollBox
- Всем внутренним объектам назначить HitTest = False

Теперь будет работать и внутренний и сквозной скроллинг

А для доступа к внутренним объектам добавить в событие OnTap для THorzScrollBox
 

 

procedure TForm1.HorzScrollBox1Tap(Sender: TObject; const [Ref] Point: TPointF);

  var Obj: IControl;
begin
    AllHitTrue(Sender as TControl); // Включаем осязаемость внутренних объектов
    Obj:= self.ObjectAtPoint(ClientToScreen(Point));  // Получаем объект
    AllHitFalse(Sender as TControl); // Отключаем осязаемость внутренних объектов, чтобы снова можно было скроллить
end;

И пару процедур
 

 

procedure AllHitTrue (Control: TControl);

var I: Integer;
begin
if Control.ControlsCount > 0 then begin
   for I := 0 to Control.ControlsCount - 1 do begin
      TControl(Control).Controls.HitTest:= True;
      AllHitTrue(Control.Controls);
   end;
end;
end;
 
procedure AllHitFalse (Control: TControl);
var I: Integer;
begin
if Control.ControlsCount > 0 then begin
   for I := 0 to Control.ControlsCount - 1 do begin
      TControl(Control).Controls.HitTest:= False;
      AllHitFalse(Control.Controls);
   end;
end;
end;

Для PresentedScrollBox у меня пока не работает.

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

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

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

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

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

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

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

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

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

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