Android SnapHelper
01.SnapHelper作用
- 在某些场景下,卡片列表滑动浏览
02.SnapHelper类分析
- 查阅可知,SnapHelper继承自RecyclerView.OnFlingListener,并且重写了onFling方法,这个类代码并不多,下面会对重要方法一一解析。
- 支持SnapHelper的RecyclerView.LayoutManager必须实现的方式:
- RecyclerView.SmoothScroller.ScrollVectorProvider接口
- 或者自己实现onFling(int,int)方法手动处理逻辑。
- 支持SnapHelper的RecyclerView.LayoutManager必须实现的方式:
- SnapHelper类重要的方法
- attachToRecyclerView: 将SnapHelper attach 到指定的RecyclerView 上。
- calculateDistanceToFinalSnap:复写这个方法计算对齐到TargetView或容器指定点的距离,这是一个抽象方法,由子类自己实现,返回的是一个长度为2的int 数组out,out[0]是x方向对齐要移动的距离,out[1]是y方向对齐要移动的距离。
- calculateScrollDistance: 根据每个方向给定的速度估算滑动的距离,用于Fling 操作。
- findSnapView:提供一个指定的目标View 来对齐,抽象方法,需要子类实现
- findTargetSnapPosition:提供一个用于对齐的Adapter 目标position,抽象方法,需要子类自己实现。
- onFling:根据给定的x和 y 轴上的速度处理Fling。
- 什么是Fling操作
- 手指在屏幕上滑动 RecyclerView然后松手,RecyclerView中的内容会顺着惯性继续往手指滑动的方向继续滚动直到停止,这个过程叫做 Fling 。 Fling 操作从手指离开屏幕瞬间被触发,在滚动停止时结束。
03.LinearSnapHelper类分析
LinearSnapHelper 使当前Item居中显示,常用场景是横向的RecyclerView,类似ViewPager效果,但是又可以快速滑动(滑动多页)。
最简单的使用就是,如下代码
- 几行代码就可以用RecyclerView实现一个类似ViewPager的效果,并且效果还不错。可以快速滑动多页,当前页剧中显示,并且显示前一页和后一页的部分。
1
2
3
4
5
6
7
8
9
10private void initRecyclerView() {
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(manager);
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(mRecyclerView);
SnapAdapter adapter = new SnapAdapter(this);
mRecyclerView.setAdapter(adapter);
adapter.addAll(getData());
}
04.PagerSnapHelper类分析
PagerSnapHelper看名字可能就能猜到,使RecyclerView像ViewPager一样的效果,每次只能滑动一页(LinearSnapHelper支持快速滑动), PagerSnapHelper也是Item居中对齐。
最简单的使用就是,如下代码
1
2
3
4
5
6
7
8
9
10private void initRecyclerView() {
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(manager);
PagerSnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(mRecyclerView);
SnapAdapter adapter = new SnapAdapter(this);
mRecyclerView.setAdapter(adapter);
adapter.addAll(getData());
}