Эффект оживленной прокрутки в TListBox - PullRequest
3 голосов
/ 19 марта 2012

Как я могу реализовать эффект упругой прокрутки , как этот (прокрутка с помощью перетаскивания мышью) в списке, используя стандартный компонент TListBox в Delphi XE2 FireMonkey?

1 Ответ

0 голосов
/ 09 мая 2012

Одним из таких решений может быть использование TListBox.ChildrenCount-1 и проверка, является ли Position.Y меньше TListBox.Parent.Height + TListBoxItem.height. Кроме того, создайте глобальную переменную boolean, например «MouseIsDown».

Поскольку каждый элемент в TListBox на самом деле является дочерним объектом, с которым вы можете работать и изменять напрямую, просто создайте большой пустой TListBoxItem и убедитесь, что он установлен как последний объект в списке.

В OnMouseDown установите MouseIsDown в True, а в OnMouseUp установите в false.

Добавьте TFloatAnimation в TListBox со свойством интерполяции, установленным на itElastic или itBounce. Если для MouseIsDown установлено значение false, отключите этот эффект, а для MouseIsDown установите значение true, включите эффект. Вам нужно будет проделать некоторую работу, чтобы сбросить позицию списка до последнего действительного объекта. Возможно, сделайте это в OnFinish событии самой анимации.

Более подходящим было бы рассчитать положение этого последнего объекта и установить StopValue анимации на это значение.


По сути, вам необходимо проверить, совпадают ли координаты последнего действительного объекта (т.е. не большого пустого объекта) в списке с высотой списка. Если они это сделают, а мышь не нажата, то анимация включена, и прокручиваемая коробка отскакивает. Если они совпадают, а мышь не работает, анимация отключается, и, таким образом, OnFinish даже не будет запущен, и поэтому поле прокрутки не будет сбрасывать свою позицию.

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

Это не будет так гладко, как реализация iOS, но должно дать вам кое-что для работы.

...