美文网首页高级UIrecycleviewAndroidUI
RecyclerView<第十二篇>:SnapHel

RecyclerView<第十二篇>:SnapHel

作者: NoBugException | 来源:发表于2019-07-15 17:41 被阅读44次

    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)

    计算SnapViewTargetView的距离,它的返回值是一个int数组,长度为2,第一个值代表x轴反向的距离,第二个值代表y轴方向的值。

    我在RecyclerView<第十一篇>:如何自定义RecyclerView已经解释了其原理,看完这篇博客自定义SnapHelper就简单多了,继承SnapHelper之后需要重写这三个重要的抽象方法。

    Andorind SDK为我们提供了LinearSnapHelperPagerSnapHelper这两个方法,他们的父类都是SnapHelper,并且这两个类都重写了以上说的三个抽象方法。

    • LinearSnapHelper:可以让RecyclerView滚动停止时相应的Item停留中间位置(这是典型的画廊效果)

    效果如下:

    110.gif
    • PagerSnapHelper:可以使RecyclerView像ViewPager一样的效果,一次只能滑一页,而且居中显示(这是典型的取代ViewPager方案)

    效果如下:

    111.gif

    代码实现比较简单,就一句话:

    new LinearSnapHelper().attachToRecyclerView(mRecyclerView);
    

    new PagerSnapHelper().attachToRecyclerView(mRecyclerView);
    
    总结

    RecyclerView<第十一篇>:如何自定义RecyclerView这篇文章是为了给这篇文章做铺垫,读完之后会更好了理解怎么自定义SnapHelper,怎么去理解LinearSnapHelperPagerSnapHelper

    至于LinearSnapHelperPagerSnapHelper的源码就不想费口舌了,和第十一篇的差不多。

    [本章完...]

    相关文章

      网友评论

        本文标题:RecyclerView<第十二篇>:SnapHel

        本文链接:https://www.haomeiwen.com/subject/oiwgkctx.html