delphi - TListBox弹性滚动效果

标签 delphi listbox scroll delphi-xe2 firemonkey

如何实现弹性滚动效果 like this one (用鼠标拖动滚动)在 Delphi XE2 FireMonkey 中使用标准 TListBox 组件在列表上?

最佳答案

一种这样的解决方案可能是利用 TListBox.ChildrenCount-1 并检查它的 Position.Y 是否小于 TListBox.Parent.Height + TListBoxItem.height。此外,创建一个全局 bool 变量,例如“MouseIsDown”。

由于 TListBox 中的每个项目实际上都是一个可以直接使用和修改的子对象,因此只需创建一个大的空 TListBoxItem 并确保将其设置为列表中的最后一个对象。

OnMouseDown 中,将 MouseIsDown 设置为 True,在 OnMouseUp 中,将其设置为 false。

TFloatAnimation 添加到 TListBox,并将插值属性设置为 itElasticitBounce。当 MouseIsDown 设置为 false 时,禁用此效果;当 MouseIsDown 设置为 true 时,启用此效果。您需要做一些工作才能将列表的位置重置为最后一个有效对象。也许可以在动画本身的 OnFinish 事件中执行此操作。

更合适的方法是计算最后一个对象的位置,并将动画的 StopValue 设置为该值。

<小时/>

本质上,您需要检查列表中最终有效对象(即不是大空白对象)的坐标是否与列表框的高度匹配。如果确实如此,并且鼠标未按下,则启用动画并且滚动框会弹起。如果它们匹配,并且鼠标按下,则动画将被禁用,因此 OnFinish 甚至不会被触发,因此滚动框不会重置其位置。

您可能需要执行迭代嵌套过程来检查每个值是否为真。

它不会像 iOS 实现那样顺利,但它应该为您提供一些可以使用的东西。

关于delphi - TListBox弹性滚动效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9774206/

相关文章:

delphi - 使用 XML 数据绑定(bind)时生成复杂类型的问题

c# - 将字符串发送到列表框 (C#)

c# - 提高 WPF 列表框的绘制速度

cocoa - 如果另一个应用程序收到滚动事件,是否有可能收到通知?

Delphi Grid DrawColumnCell无法清除

Delphi:可维护性虚拟与虚拟抽象

c# - 如何解决从 Delphi 调用 C# dll 方法时出现的错误外部异常 E0434352

c# - 如何给 ListBox 项目上色?

c# - Control.MouseWheel 事件

emacs - Emacs 中的(Ctrl + 上/下)式滚动