简介
在列表滑动浏览,有时希望当滑动停止某个 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也没有提供公开方法用于指定滑动距离的时间和差值器。
网友评论