美文网首页
SnapHelper实现RecyclerView滑动对齐效果

SnapHelper实现RecyclerView滑动对齐效果

作者: 总是说下次 | 来源:发表于2017-10-25 22:56 被阅读1347次

    简介

    在列表滑动浏览,有时希望当滑动停止某个 ItemView 时可以停留在屏幕中央吸引用户的焦点,或者在边缘显示半个提示用户还有更多内容。RecyclerView在24.2.0版本中新增了SnapHelper这个辅助类来实现该效果。

    SnapHelper的主作用就是寻找离目标位置最近的ItemView作为SnapView并滑动到目标位置。

    SnapHelper类提供了三个抽象方法,方便子类实现不同的对齐效果:

    查找当前离目标最近的ItemView

    public abstract View findSnapView(LayoutManager layoutManager);
    

    根据加速度返回需要对齐ItemView的位置,主要用于fling 操作

    public abstract int findTargetSnapPosition(LayoutManager layoutManager, int velocityX,
                int velocityY)            
    

    返回targetView 对齐到指定目标位置的x,y轴上的偏移量。

    public abstract int[] calculateDistanceToFinalSnap(@NonNull LayoutManager layoutManager,
                @NonNull View targetView)
    

    与RecyclerView交互

    SnapHelper.attachToRecyclerView() 方法中调用了 RecyclerView.addOnScrollListener() 和RecyclerView.setOnFlingListener()两个方法监听RecyclerView的滑动事件。

    • recycleView 滑动则OnScrollListener收到回调,滑动停止后调用 SnapHelper.snapToTargetExistingView() 寻找SnapView 计算对齐对目标位置的位移量,调用RecyclerView.smoothScrollBy()方法对齐。
    • recyclerView 有Fling操作则OnFlingListener收到回调,并调用SnapHelper.snapFromFling(),根据加速度计算将要对齐的ItemView 的位置,利用 LinearSmoothScroller 进行平滑滚动对齐操作。

    相关知识点

    • fling操作时平滑滚到到目标位置。

      LinearSmoothScroller一般只是把目标targetPosition移到recyclerView的边缘。可重写方法以到到想要的效果。

    • OrientationHelper.createHorizontalHelper(layoutManager)可用于计算recyclerview中的Item的位置。

    遗留问题

    • 对齐太快,但是recyclerview也没有提供公开方法用于指定滑动距离的时间和差值器。

    相关文章

      网友评论

          本文标题:SnapHelper实现RecyclerView滑动对齐效果

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