目录
- RecyclerView之概述
- RecyclerView之绘制流程
- RecyclerView之Adapter
- RecyclerView之ItemDecoration
- RecyclerView之ItemAnimator
- RecyclerView之DiffUtil
- RecyclerView之缓存策略
概要
SnapHelper用于辅助RecyclerView在滚动结束时将Item对齐到某个位置。能让RecyclerView实现类似ViewPager等功能。
RecyclerView描述滚动状态的几个属性:
SCROLL_STATE_IDLE
:滚动闲置状态,此时并没有手指滑动或者动画执行SCROLL_STATE_DRAGGING
:滚动拖拽状态,由于用户触摸屏幕产生SCROLL_STATE_SETTLING
:自动滚动状态,此时没有手指触摸,一般是由动画执行滚动到最终位置,包括smoothScrollTo等方法的调用
当手指在屏幕上滑动RecyclerView然后松手,RecyclerView中的内容会顺着惯性继续往手指滑动的方向继续滚动直到停止,这个过程叫做Fling
。
Fling
当触发MotionEvent.ACTION_UP时,RecyclerView会进行fling判断。
1 |
|
由源码可知,会来到SnapHelper进行判断。
SnapHelper
SnapHelper是一个抽象类,具体实现有LinearSnapHelper、PagerSnapHelper。
1 |
|
通过下面的代码,注册到RecyclerView中,可以实现相应的效果。
1 | //滚动停止时相应的Item停留中间位置 |
来看看LinearSnapHelper的源码
依附RecyclerView流程
1 |
|
onFling
在RecyclerView中的fling方法中,如果依附来LinearSnapHelper,会调用LinearSnapHelper的onFling方法进行判断。
1 |
|
总结
- 使用时使用attachToRecyclerView添加依附
- onFling操作触发的时候首先通过findTargetSnapPosition找到最终需要滚动到的位置,然后启动平滑滚动器滚动到指定位置,
- 在指定位置找出来后,系统会回调onTargetFound,然后调用calculateDistanceToFinalSnap方法计算targetView需要减速滚动的距离,然后通过Action
更新给滚动器。 - 在滚动停止的时候,也就是state变成SCROLL_STATE_IDLE时会调用snapToTargetExistingView,通过findSnapView找到SnapView,然后通过
calculateDistanceToFinalSnap计算得到滚动的距离,做最后的对齐调整。