Android SnapHelper

01.SnapHelper作用

  • 在某些场景下,卡片列表滑动浏览

02.SnapHelper类分析

  • 查阅可知,SnapHelper继承自RecyclerView.OnFlingListener,并且重写了onFling方法,这个类代码并不多,下面会对重要方法一一解析。
    • 支持SnapHelper的RecyclerView.LayoutManager必须实现的方式:
      • RecyclerView.SmoothScroller.ScrollVectorProvider接口
      • 或者自己实现onFling(int,int)方法手动处理逻辑。
  • 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
    10
    private 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
    10
    private 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());
    }