有没有办法计算滚动结束位置

时间:2015-07-29 03:54:01

标签: android scrollview android-recyclerview

我想知道滚动(recyclerview,scrollview)将在Fling方法中以速度停止滚动的位置。 有没有办法计算这个?

1 个答案:

答案 0 :(得分:7)

我查看了source code of RecyclerView,它使用了一个内部类ViewFlinger和以下成员变量:

private ScrollerCompat mScroller;

总而言之,当检测到一个fling时,它由ViewFlinger的一个实例处理。 ViewFlinger然后在mScroller上设置fling速度并让它找出动画曲线。 ScrollerCompat是你想要的东西b / c它有方便的API来获取滚动的final x and y。不幸的是,您需要访问的ScrollerCompat实例mScroller不会被RecyclerView公开。 mScroller.fling(0,0,velocityX,velocityY,Integer.MIN_VALUE,Integer.MAX_VALUE,Integer.MIN_VALUE,Integer.MAX_VALUE); 两种可能的方案。一旦你获得了fling事件并且涉及获取或创建ScrollerCompat实例,两者都应该完成:

  1. 使用反射来获取mScroller实例。
  2. 保留ScrollerCompat实例并以与RecyclerView相同的方式初始化它。然后传递速度:mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
  3. 获得ScrollerCompat实例后,调用公共API以获取最终的x和y位置。假设您拥有相同大小的视图并且知道列表中的起始位置,您可以计算它将落在的视图。像这样:

    // Assumes vertical scrolling
    const int childHeight = this.getChildren().getChildAt(0).getHeight();
    float childOffset = mScroller.getFinalY() / childHeight;