SnapHelper实现RecyclerView滑动对齐效果

简介

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

SnapHelper 是个抽象类,在25.1.+版本官方提供了 ItemView 停留在中间位置的实现 LinearSnapHeler ,和类似于 ViewPager 效果的PageSnapHelper

原理

首先来张图

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也没有提供公开方法用于指定滑动距离的时间和差值器。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容