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

Fox*_*chu 12 android scrollview

上下文:我有一个ScrollView可能会在投掷期间将子项添加到其内容视图中.由于在添加这些子项之前将fling配置为ScrollView内容的高度,如果添加了子项,则fling会自行停止(并且由于过度滚动而实际上向后滚动一点),即使它没有到达内容的底部.

我可以重新开始使用#fling(int velocity),但我无法想办法获得当前的飞行速度或停止当前的飞行.有任何想法吗?

Tre*_*ers 7

要从提示中回答您的问题:

  • 没有API来获取ScrollView的当前速度.
  • 您可以通过仔细处理触摸事件来停止当前的投掷,如之前的SO帖子中所述.

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

  1. 使用反射访问ScrollView中的mScroller私有字段.一旦你访问它,你就可以通过它的公共API获得当前的速度:public float getCurrVelocity();使用反射永远不是理想的,因为你不得不担心它跨越Android版本,但一个简单的孤立使用可以相对有效.
  2. 覆盖ScrollView中的fling ()方法并实例化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);
}
Run Code Online (Sandbox Code Playgroud)