有什么方法可以计算滚动结束位置
Is there any way to calculate scroll-end position
我想知道在 Fling 方法中,滚动条(recyclerview、scrollview)将在何处停止以速度滚动。
有什么方法可以计算吗?
我查看了 source code of RecyclerView,它使用内部 class ViewFlinger 和以下成员变量:
private ScrollerCompat mScroller;
总而言之,当检测到 Fling 时,它由 ViewFlinger 的实例处理。 ViewFlinger 然后在 mScroller 上设置 fling velocity 并让它计算出动画曲线。 ScrollerCompat 是您想要达到 b/c 的目的,它具有用于获取滚动 final x and y 的便捷 API。不幸的是,您需要访问的 ScrollerCompat 实例 mScroller 没有被 RecyclerView 暴露。
mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
两种可能的解决方案。两者都应该在您获得 fling 事件并涉及获取或创建 ScrollerCompat 实例后完成:
- 使用反射抓取mScroller实例。
- 保留一个ScrollerCompat实例,并像RecyclerView一样初始化它。然后传入fling速度:
mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
获得 ScrollerCompat 实例后,调用 public API 获取最终的 x 和 y 位置。假设您有大小相同的视图并且知道您在列表中的开始投掷位置,您可以计算它将落在哪个视图上。像这样:
// Assumes vertical scrolling
const int childHeight = this.getChildren().getChildAt(0).getHeight();
float childOffset = mScroller.getFinalY() / childHeight;
我想知道在 Fling 方法中,滚动条(recyclerview、scrollview)将在何处停止以速度滚动。 有什么方法可以计算吗?
我查看了 source code of RecyclerView,它使用内部 class ViewFlinger 和以下成员变量:
private ScrollerCompat mScroller;
总而言之,当检测到 Fling 时,它由 ViewFlinger 的实例处理。 ViewFlinger 然后在 mScroller 上设置 fling velocity 并让它计算出动画曲线。 ScrollerCompat 是您想要达到 b/c 的目的,它具有用于获取滚动 final x and y 的便捷 API。不幸的是,您需要访问的 ScrollerCompat 实例 mScroller 没有被 RecyclerView 暴露。 mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE); 两种可能的解决方案。两者都应该在您获得 fling 事件并涉及获取或创建 ScrollerCompat 实例后完成:
- 使用反射抓取mScroller实例。
- 保留一个ScrollerCompat实例,并像RecyclerView一样初始化它。然后传入fling速度:
mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
获得 ScrollerCompat 实例后,调用 public API 获取最终的 x 和 y 位置。假设您有大小相同的视图并且知道您在列表中的开始投掷位置,您可以计算它将落在哪个视图上。像这样:
// Assumes vertical scrolling
const int childHeight = this.getChildren().getChildAt(0).getHeight();
float childOffset = mScroller.getFinalY() / childHeight;