2012-03-19 3 views
3

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

+0

"bouncy scroll", что это? – Kromster

+0

@KromStern. Это прокрутка «touch style», где, если вы попытаетесь прокрутить больше, это позволит вам нажимать содержимое (т. Е. Прокручивать вниз), но когда вы отпускаете его, он возвращается в правильное положение. –

+0

Я не знаю nuthin о FireMonkey. Но если это «стандартный» Win32 'ListBox', то вы не можете получить такое поведение - элемент управления Windows не предоставляет его. Я попытался получить тот же эффект от некоторых пользовательских элементов управления, но это намного сложнее, чем я мог бы подумать. –

ответ

0

Одним из таких решений может быть использование 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 самой анимации.

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


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

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

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