添加子项时如何正确地继续滚动 ScrollView?

How can you correctly continue the fling of a ScrollView when adding children?

上下文:我有一个 ScrollView,它可能在快速浏览期间将子项添加到其内容视图中。由于 fling 配置了 ScrollView 内容的高度 before 添加了这些子项,如果添加了子项,则 fling 会自行停止(实际上会向后滚动一点,因为overscroll) 即使它还没有到达内容的底部。

我可以使用 #fling(int velocity) 重新启动投掷,但我想不出获取当前投掷速度或停止当前投掷的方法。有什么想法吗?

我用 @Override fling 方法解决了类似的问题。如果您在 ScrollViewNoFling class 上重写 fling 方法而不是在此方法上调用 super.fling,您将无法处理 scrollView.

@Override
public void fling (int velocity)
{
    /*Scroll view is no longer going to handle scroll velocity.
     * super.fling(velocity);
    */
}

根据提示回答您的问题:

  • 没有API获取ScrollView的当前速度。
  • 您可以按照前面 SO post.
  • 中所述小心处理触摸事件来停止当前的 fling

查看ScrollView source code,它使用OverScroller 来处理fling 事件。有两种方法可以解决这个问题:

  1. 使用反射访问ScrollView中的mScroller私有字段。一旦你访问它,你就可以通过它的 public API 获得当前速度: public float getCurrVelocity(); 使用反射从来都不是理想的,因为你不得不担心它会跨越 android 版本,但简单的隔离使用可能相对有效。
  2. 覆盖 fling() method in ScrollView 并实例化一个 OverScroller 以跟踪滚动。如果一切顺利,您的 Overscoller 将始终处于与 ScrollView 中的状态相同的状态。

像这样:

@Override
public void fling(int velocityY)
{
    // Pass through fling to parent
    super.fling(velocityY);

    // Keep track of velocity using our own Overscoller instance
    mOurOverscroller = mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0,
    Math.max(0, bottom - height), 0, height/2);
}