使用RecyclerView + SnapHelper實現類似ViewPager效果


本文只是做個這個知識點的筆記,也是參考別的博主寫的東西,我記錄的沒有解釋源碼,僅僅只是簡單了解SnapHelper的效果以及用法,要想了解源碼,還請參考原博主的博客,原文鏈接:https://blog.csdn.net/ChrisSen/article/details/80676459 個人覺得這個博主寫的非常詳細易懂。

如果我們正常使用RecyclerView的話,那我們實現的效果就應該和下面的一樣:當我們進行滑動的時候,RecyclerView中的Item停止的位置是取決於你滑動時的速度(Fling),可能會出現的情況是最終我們停止的位置可能位於兩個item之間,當然也有可能正好位於某個item的中間。

如果這個時候我們的產品經理提出最終停止的位置一定要在某個Item上,不能出現位於兩個之間的情況;或者產品經理說滑動的時候我們要一個一個滑過去,不能一下滑好多個…

我們先來看看效果。

 

效果:滑動停止后Item的中心會被附加到RecyclerView的中心,說的直白點就是滑動停止后會顯示一個完整的Item。

效果:滑動時一個一個滑動,類似於ViewPager滑動效果。

SnapHelper

實現上面兩種效果用到的類就是SnapHelper。

SnapHelper的作用其實和重寫onFling()的效果一樣,只不過不是用監聽的方式了,而是采用一個專門的類來處理。

什么是Snapping呢?谷歌翻譯的意思有卡,斷,驟,折的意思。感覺好像不搭邊啊。我的理解是:Snap代表的是一種狀態,這種狀態是處於動與靜之間的過渡狀態。對於RecyclerView來說就是處理滑動后停止時的狀態。比如我們實現的第一個效果,當RecyclerView處於靜止的時候,SnapHelper處理的方式就是把停止后的Item的中心依附於RecyclerView的中心。第二種效果SnapHelper處理的方式就是滑動后把下一個Item的中心依附於RecyclerView。

SnapHelper是一個抽象類,繼承自RecyclerView.OnFlingListener,OnFlingListener中只有一個抽象方法onFling(int velocityX, int velocityY)。onFling()方法主要用來處理fling效果。SnapHelper有兩個直接子類:LinerSnapHelper , PagerSnapHelper。LinerSnapHelper 主要用來實現第一個效果的,PagerSnapHelper用來實現類似於ViewPager效果。它們倆的使用也非常簡單。

LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
linearSnapHelper.attachToRecyclerView(mRecyclerView);

  

PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(mRecyclerView);

只需要兩行代碼就可以實現想要的效果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM