RecyclerView在24.2.0版本中新增了SnapHelper这个辅助类,用于确定RecyclerView滚动停止后的目标位置、离目标View最近的Item以及目标View的position。
SnapHelper有三个抽象方法,分别是:
@Nullable
public abstract int[] calculateDistanceToFinalSnap(@NonNull LayoutManager var1, @NonNull View var2);
@Nullable
public abstract View findSnapView(LayoutManager var1);
public abstract int findTargetSnapPosition(LayoutManager var1, int var2, int var3);
SnapHelper抽象类最重要的三个方法就是以上三个抽象方法,其它方法可以不用看了,既然是三个最终要的方法,那么就必须了解这三个方法的作用具体是什么?
说明三个方法含义之前,还需要说明以下几个词的意思:
SnapView
:当您手指迅速滑动RecyclerView后,在某个方向会有一个速度向量,使Item按照一定的速度沿着某个方向滚动,最终停止的Item为SnapView
。
TargetSnapPosition
:目标View的位置,通过计算,SnapView
会停止在预先设定好的位置。
TargetView
:目标位置,TargetView
是我们虚构出来的,目的是将SnapView
移动到TargetView
的位置。
下面讲解一下SnapHelper重要的三个抽象方法:
int findTargetSnapPosition(LayoutManager var1, int var2, int var3)
获取TargetSnapPosition,即计算出最终位置,var2是x轴的速度向量,var3是y轴的速度向量,根据这两个速度向量计算出最终停止的位置。
View findSnapView(LayoutManager var1)
获取SnapView
,即实际上滚动停止时的位置对应的Item。
int[] calculateDistanceToFinalSnap(@NonNull LayoutManager var1, @NonNull View var2)
计算SnapView
和TargetView
的距离,它的返回值是一个int数组,长度为2,第一个值代表x轴反向的距离,第二个值代表y轴方向的值。
我在RecyclerView<第十一篇>:如何自定义RecyclerView已经解释了其原理,看完这篇博客自定义SnapHelper
就简单多了,继承SnapHelper之后需要重写这三个重要的抽象方法。
Andorind SDK为我们提供了LinearSnapHelper
和PagerSnapHelper
这两个方法,他们的父类都是SnapHelper
,并且这两个类都重写了以上说的三个抽象方法。
-
LinearSnapHelper
:可以让RecyclerView滚动停止时相应的Item停留中间位置(这是典型的画廊效果)
效果如下:
110.gif-
PagerSnapHelper
:可以使RecyclerView像ViewPager一样的效果,一次只能滑一页,而且居中显示(这是典型的取代ViewPager方案)
效果如下:
111.gif代码实现比较简单,就一句话:
new LinearSnapHelper().attachToRecyclerView(mRecyclerView);
和
new PagerSnapHelper().attachToRecyclerView(mRecyclerView);
总结
RecyclerView<第十一篇>:如何自定义RecyclerView这篇文章是为了给这篇文章做铺垫,读完之后会更好了理解怎么自定义SnapHelper,怎么去理解LinearSnapHelper
和PagerSnapHelper
。
至于LinearSnapHelper
和PagerSnapHelper
的源码就不想费口舌了,和第十一篇的差不多。
[本章完...]
网友评论