【发布时间】:2015-07-29 03:54:00
【问题描述】:
我想知道滚动(recyclerview、scrollview)将在 Fling 方法中以速度停止滚动的位置。 有什么方法可以计算吗?
【问题讨论】:
标签: android scrollview android-recyclerview
我想知道滚动(recyclerview、scrollview)将在 Fling 方法中以速度停止滚动的位置。 有什么方法可以计算吗?
【问题讨论】:
标签: android scrollview android-recyclerview
我查看了source code of RecyclerView,它使用了一个带有以下成员变量的内部类 ViewFlinger:
private ScrollerCompat mScroller;
总而言之,当检测到投掷时,它由 ViewFlinger 的实例处理。 ViewFlinger 然后在 mScroller 上设置投掷速度并让它计算出动画曲线。 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 实例,两者都应该完成:
mScroller.fling(0, 0, velocityX, velocityY, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
获得 ScrollerCompat 实例后,调用公共 API 以获取最终的 x 和 y 位置。假设您有大小相同的视图并且知道您在列表中的起始位置,您可以计算它将登陆的视图。像这样的:
// Assumes vertical scrolling
const int childHeight = this.getChildren().getChildAt(0).getHeight();
float childOffset = mScroller.getFinalY() / childHeight;
【讨论】: