• 0
dreamix

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

Вопросы

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

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


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

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

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

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


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

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

  • 0

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

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


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

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

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

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

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


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

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

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


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

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

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

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

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


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

 

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

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

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

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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 без Update1, Android 4.3

Изменено пользователем 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 у меня пока не работает.

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


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

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

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

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

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

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

Войти

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

Войти

  • Похожий контент

    • От Alesk
      Как подключить gesturemanager1 к кнопке созданной в runtime?
      Когда пишу эту строчку
      izm[ii].Touch.GestureManager:=GestureManager1; ругается на Gesturemanager1
      izm[ii] - массив из tbutton
    • От ivadimos
      Хочу написать итем пикер на основе скроллбокса(листобокса, тут не суть важна),
      выглядеть он должен так, обычный скролл, но в области видимости только 5 элементов. 3й элемент(цетральный) как бы выделен(на его уровне вне листбокса лежит прямоугольник, который его типа подсвечивает). В чём проблема.
      всё работает красиво, но хотелось бы, что бы при окончании скроллинга происходило приближение к элементу, чья  позиция ближе всего к позиции, которую подсвечивает прямоугольник. 

    • От Алекс
      Добрый день!
      Однажды на форуме обсуждалась тема как сделать переключение вкладок TabControl  с анимацией через TActionList.
      Сейчас возникла необходимость переключать вкладки через жест pan? т.е. чтобы вкладка двигалась за пальцем пользователя (как это сделано практически во всех мобильных приложениях, например в фейсбуке. Ниже скрин, на котором показаны по половине обе вкладки, они в этот момент перетаскиваются пальцем).
      Это реально сделать? Если да, то как? Я уже подозреваю, что табом такого не сделаешь, а только широкой панелью, разделенное на сектора.

    • От ophion
      Добрый день.
      В рантайме создаются TButton и помещаются в TVertScrollBox.
      Если во время прокручивания нажать пальцем на TButton, то срабатывает событие OnClick.
      Собственно вопрос... как избежать такого поведения? Т.е. как разрешить нажатие на кнопки только после того, как прокручивание остановилось?
    • От Евгений Корепов
      Delphi XE8, Android.
      Пишу слайдер картинок. Задачу себе поставил аналогичную слайдеру Ввконтакте. Т.е. Жестами листаем налево/направо, двойной клик увеличение, повторный двойной клик уменьшение, ну и пальцами можно растягивать изображения.
       
      Все работало замечательно до момента добавления анимации. Слайд (TImage) лежит в TScrollBox. Анимация увеличения (FloatAnimation) тоже отлично работает. 
      Но позиционирование картинки сделать не могу с анимацией, анимацию не могу привязать к ViewportPosition. В итоге, при увеличении картинки, не область по которой ткнули, а по уродски - левый верхний угол остаётся зафиксированным, увеличивается вправо и вниз.
       
      Как можно связать FloatAnimation и ViewportPosition ?
    • От Tarik02
      Как реализовать плавный скроллинг в ScrollBox. Скроллинг програмный(ScrollTo). Я хотел бы примерно такую анимацию, что сначало скорость мала, потом чуть больше, и на конец снова мала. Но это не обязательно.
    • От Вячеслав
      Всем доброго дня! Озадачился работой с жестами и все было хорошо, жесты ловятся, выводятся в Мемо, как в хелпе. НО: когда форма выводится в стиле Metropolis (на полный экран, значков закрытия, сворачивания и разворачивания программы нет), то жесты почему-то отваливаются, Мемо ничего не выводит, событие OnGesture не срабатывает.
      Пишу под сенсорный экран компа. Версия Rad Studio XE5
      Никто не сталкивался с таким?
  • Последние посетители   0 пользователей онлайн

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