似乎是完成动画所需的持续时间的问题,smoothScrollBy(int distance, int duration) 也存在同样的问题,粗略一瞥,smoothScrollToPosition() 是围绕 smoothScrollBy() 的友好包装,它做了很多跑腿。反过来,smoothScrollBy() 正在假装“挥动手势”,就好像用户做出了动作一样。
smoothScrollBy 实际上只是发布了可继续重新发布的可运行文件,直到持续时间用完为止。这意味着它只是根据之前决定移动到的偏移量计算所需的滚动偏移量,因此如果持续时间在它到达目标偏移量之前用完,它会在最后计算的偏移量处停止。(而不是突然跳到目标偏移,这可能更不和谐,因为它不会被动画化)。
Android 人员的困难在于确定每次 run() 调用移动多少才能达到所需的偏移量,因为 ListView 单元格(子项)的高度是完全动态的,所以他们不能只做一个简单的距离计算,因为可见孩子的身高他们不知道。这与 Android 滚动条在您滚动时大小会波动的原因相同,它必须根据当前看到的内容来最好地猜测它应该有多大。
无论如何,这并不能帮助您解决它,但有些人可能会觉得它很有趣:)
但是,如果您知道自己有静态单元格高度,则可以编写自己的方法来计算传递给 smoothScrollBy() 的距离和持续时间,并有固定的时间来移动 X 距离。如果您不这样做,则必须使用发布的解决方案 bigstones 就足够了,由于 1000 毫秒的高 SCROLL_DURATION,这确实有效。您也可以使用 ICS 版本并更改此属性,而不是使用 2.2 版本,这不是根本原因。
您还可以使用自己的自定义算法调整这些可运行文件,调整这些东西应该不会太难。