一、SnapHelper的用处
SnapHelper是一个RecyclerView的工具类,本身是抽象类,默认有两种实现LinearSnapHelper和PageSnapHelper。他们的主要作用是帮助ReyclerView自定义滑动方式,可以实现像ViewPage或者Gallery的滑动方式(一次翻一页或者一次翻多页),SnapHelper主要的作用是辅助操控RecyclerView的Fling过程。
二、用法,默认实现
1、用法简单
SnapHelper lineSnapHelper = new LinearSnapHelper();
lineSnapHelper.attachToRecyclerView(recyclerView);
2、提供2个默认实现
a、LinearSnapHelper
效果:一次只可滑动多个Item(即支持Fling操作,惯性滑动),总是中心对齐
b、PagerSnapHelper
效果:一次只能滑动一个Item,总是中心对齐。
三 、SnapHelper源码解析
SnapHelper是一个抽象类,主要有三个抽象方法让子类实现,这里先介绍它们的作用,具体实现由子类完成。
1、public abstract View findSnapView(LayoutManager layoutManager);
官方描述:Override this method to provide a particular target view for snapping.
这个方法是找到一个目标view。这个目标view是什么要看子类的实现。比如LinearSnapHelper和PagerSnapHelper是中心对齐,所以它的目标view是RecyclerView布局中最靠近中间的view。
2、 public abstract int[] calculateDistanceToFinalSnap(LayoutManager layoutManager,View targetView);
官方描述:Override this method to snap to a particular point within the target view or the container
view on any axis.
这个方法是计算出传入的targetView滑动到对其位置的距离。这个对齐位置也要看子类的实现,比如LinearSnapHelper和PagerSnapHelper是中心对齐,所以这个方法返回的是targetView到RecyclerView最中间位置的距离。
3 、public abstract int findTargetSnapPosition(LayoutManager layoutManager, int velocityX,int velocityY);
官方描述:Override to provide a particular adapter target position for snapping.
这个方法是根据速度来找到target view的Position,这里的速度是监听FlingListener获得的。
四、SnapHelper总结
SnapHelper主要是对RecyclerView的滑动添加了监听,OnScrollListener和OnFlingListener。每次滚动结束或者Fling(惯性滑动)结束后,对Item进行对齐,而其对齐方式让子类实现。
五、自定义SnapHelper
根据业务需求,我们可以自定义SnapHelper,比如要做一个屏幕显示两页的Banner。
我们可以直接继承LinearSnapHelper,然后重写calculateDistanceToFinalSnap、findSnapView两个方法,去修改对齐方式。
此外还可以加上自动滚动的功能。
网友评论