我想知道滚动(recyclerview,scrollview)将在Fling方法中以速度停止滚动的位置。 有没有办法计算这个?
答案 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实例,两者都应该完成:
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;