Algorithm 实现动态滚动的算法

Algorithm 实现动态滚动的算法,algorithm,language-agnostic,mobile,scroll,touchscreen,Algorithm,Language Agnostic,Mobile,Scroll,Touchscreen,创建动态滚动实现的一些好算法是什么?该功能将在自定义UI列表上进行测试。当我瞄准移动设备(那些没有内置此功能的设备)时,来自不同编程领域的任何算法或代码示例也可能适合。我认为这就像是a)获得用户滚动速度b)当他离开手指时,自动滚动列表,但速度会随着用户拥有的初始速度而降低。我最近自己实现了一个。这些是我采取的步骤 您需要测量光标的速度(鼠标光标或手指) 实现一个简单的粒子物理循环。可以找到有关如何执行此操作的信息 使用从滚动平面宽度和视口宽度导出的数学,给出粒子“边界” 不断地将鼠标速度和粒子速

创建动态滚动实现的一些好算法是什么?该功能将在自定义UI列表上进行测试。当我瞄准移动设备(那些没有内置此功能的设备)时,来自不同编程领域的任何算法或代码示例也可能适合。

我认为这就像是a)获得用户滚动速度b)当他离开手指时,自动滚动列表,但速度会随着用户拥有的初始速度而降低。

我最近自己实现了一个。这些是我采取的步骤

  • 您需要测量光标的速度(鼠标光标或手指)
  • 实现一个简单的粒子物理循环。可以找到有关如何执行此操作的信息
  • 使用从滚动平面宽度和视口宽度导出的数学,给出粒子“边界”
  • 不断地将鼠标速度和粒子速度之间的差值添加到粒子速度中,这样,只要鼠标移动,粒子的速度就会“匹配”鼠标的速度
  • 一旦用户抬起手指,停止执行步骤4。物理循环考虑惯性
  • 添加你的个人装饰,比如“保险杠”边距,以及平滑滚动的“锚”点,这些点在zeno计算运动的悖论中起作用
  • 我差点忘了:取上面导出的坐标,并将其用作滚动平面的位置
  • 我可能很快就会打开这段代码的源代码。你多久需要这个


    编辑:更改了链接。抱歉,指向的页面稍有错误。编辑2:还是不?无论如何,我链接到的原始页面是当前链接页面上的第一个链接。

    既然最初有人问我这个问题,我就仔细阅读了pastrykit的源代码,苹果在这个框架中完全复制了他们在javascript中的动态滚动。没有粒子物理循环-触摸的速度是在手指抬起的准确时刻测量的。从这一点开始,使用一个简单的放松功能(使用速度作为输入参数)为滚动设置动画

    我刚刚在我的移动GUI框架中添加了一个滚动小部件,所以我想在这里分享我的解决方案

    由于这是一个相当复杂的问题,我决定将其划分为更小的、稍微独立的子任务,如下所示:

  • 基本滚动功能:此任务包括以最简单的方式处理拖动事件,即根据拖动距离和方向滚动内容。这是相对简单的实现,唯一棘手的方面是知道何时开始拖动操作,而不是何时将点击事件传递给可滚动区域内的子小部件

  • 滚动惯性:这是最具挑战性的。这里的想法是,在用户抬起手指后,滚动应该持续一段时间,直到完全停止。为此,我需要了解滚动速度。不幸的是,从单个样本计算速度是不准确的,因此当用户滚动时,我将最后N个运动事件记录在循环缓冲区中,以及每个事件发生的时间。我发现N=4在iPhone和HP TouchPad上运行良好。当手指抬起时,我可以根据记录的运动计算惯性滚动的近似开始速度。我定义了一个负的加速度系数,并使用标准的运动公式(请参阅)让滚动很好地消失。如果滚动位置在运动中到达边界,我只需将速度重置为0,以防止其超出范围(下一步处理突然停止)

  • 灵活的滚动限制:当滚动结束时,我希望小部件滚动一些,但提供阻力,而不是突然停止。为此,我将两端允许的滚动范围扩展了一个数量,我将其定义为小部件尺寸的函数。我发现在每一端增加一半的宽度或高度效果很好。给滚动带来某种阻力的感觉的诀窍是在滚动超出范围时调整显示的滚动位置。为此,我使用了一个缩放加减速功能(有一些很好的缓和功能)

  • Spring行为:因为现在可以滚动到有效范围之外,所以我需要一种方法,如果用户将滚动条超出范围,则可以将其恢复到有效位置。这是通过在滚动条在超出范围位置停止时调整滚动偏移来实现的。我发现的调整函数可以给人一种很好的弹性外观,它将当前位置到所需位置的距离除以一个常数,然后移动偏移量。常数越大,运动越慢

  • 滚动条:最后一步是添加叠加滚动条,滚动开始时淡入,结束时淡出


  • 你看过罗伯特·彭纳的放松功能吗


    IIRC这些最初是用于Actionscript的,已经存在很长时间了

    我将尝试在几周内亲自实施这一计划。现在我只是在想。谢谢你的回复。如果你决定开源你的解决方案,在这里发布一些公告。链接现在已经过时很久了:(我以前从未见过这些!非常有用。+1