RecyclerView<第十二篇>:SnapHelper使用

RecyclerView在24.2.0版本中新增了SnapHelper這個輔助類,用於確定RecyclerView滾動停止後的目標位置、離目標View最近的Item以及目標View的position。

SnapHelper有三個抽象方法,分別是:

@Nullable
public abstract int[] calculateDistanceToFinalSnap(@NonNull LayoutManager var1, @NonNull View var2);

@Nullable
public abstract View findSnapView(LayoutManager var1);

public abstract int findTargetSnapPosition(LayoutManager var1, int var2, int var3);

SnapHelper抽象類最重要的三個方法就是以上三個抽象方法,其它方法可以不用看了,既然是三個最終要的方法,那麼就必須瞭解這三個方法的作用具體是什麼?

說明三個方法含義之前,還需要說明以下幾個詞的意思:

SnapView:當您手指迅速滑動RecyclerView後,在某個方向會有一個速度向量,使Item按照一定的速度沿着某個方向滾動,最終停止的Item爲SnapView
TargetSnapPosition:目標View的位置,通過計算,SnapView會停止在預先設定好的位置。
TargetView:目標位置,TargetView是我們虛構出來的,目的是將SnapView移動到TargetView的位置。

下面講解一下SnapHelper重要的三個抽象方法:

  • int findTargetSnapPosition(LayoutManager var1, int var2, int var3)

獲取TargetSnapPosition,即計算出最終位置,var2是x軸的速度向量,var3是y軸的速度向量,根據這兩個速度向量計算出最終停止的位置。

  • View findSnapView(LayoutManager var1)

獲取SnapView,即實際上滾動停止時的位置對應的Item。

  • int[] calculateDistanceToFinalSnap(@NonNull LayoutManager var1, @NonNull View var2)

計算SnapViewTargetView的距離,它的返回值是一個int數組,長度爲2,第一個值代表x軸反向的距離,第二個值代表y軸方向的值。

我在RecyclerView<第十一篇>:如何自定義RecyclerView已經解釋了其原理,看完這篇博客自定義SnapHelper就簡單多了,繼承SnapHelper之後需要重寫這三個重要的抽象方法。

Andorind SDK爲我們提供了LinearSnapHelperPagerSnapHelper這兩個方法,他們的父類都是SnapHelper,並且這兩個類都重寫了以上說的三個抽象方法。

  • LinearSnapHelper:可以讓RecyclerView滾動停止時相應的Item停留中間位置(這是典型的畫廊效果)

效果如下:

  • PagerSnapHelper:可以使RecyclerView像ViewPager一樣的效果,一次只能滑一頁,而且居中顯示(這是典型的取代ViewPager方案)

效果如下:

代碼實現比較簡單,就一句話:

new LinearSnapHelper().attachToRecyclerView(mRecyclerView);

new PagerSnapHelper().attachToRecyclerView(mRecyclerView);
總結

RecyclerView<第十一篇>:如何自定義RecyclerView這篇文章是爲了給這篇文章做鋪墊,讀完之後會更好了理解怎麼自定義SnapHelper,怎麼去理解LinearSnapHelperPagerSnapHelper

至於LinearSnapHelperPagerSnapHelper的源碼就不想費口舌了,和第十一篇的差不多。

[本章完...]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章