RcyclerView滑動(dòng)只抽出三個(gè)(詳細(xì)查看資料:https://www.2cto.com/kf/201805/741786.html)
關(guān)于RecyclerView滑動(dòng)到指定位置,它提供了scrollTo(),scrollBy(),scrollToPosition(),smoothScrollBy(),
smoothScrollToPosition()方法,下面是中這些方法的三個(gè)方法介紹。
1 scrollTo(int x, int y)
該方法在View中的意思是滑動(dòng)到絕對(duì)位置,比如當(dāng)前位置為(10,10),通過scrollTo(30,30),最后的位置為
(30,30)。但從上面scrollTo方法源代碼中可以看出,RecyclerView并不支持滑動(dòng)到絕對(duì)位置,因?yàn)樵摲椒榭諏?shí)
現(xiàn),而是使用scrollToPosition(position)方法來代替。
2 scrollBy(int x, int y)
該方法為滑動(dòng)到相對(duì)位置,比如當(dāng)前位置為(10,10),通過scrollBy(30,30),最后的位置為(40,40)。在該方法
中,首先會(huì)判斷mLayout是否為空,mLayout就是RecyclerView持有的LayoutManager,然后再判斷
RecyclerView是橫向還是垂直滑動(dòng),如果是橫向滑動(dòng)則取(x,0)傳遞到scrollByInternal方法中,反之垂直則取
(0,y)。
3 smoothScrollBy(int dx, int dy)和smoothScrollBy(int dx, int dy, Interpolator interpolator)(****)
這個(gè)兩個(gè)方法都是平滑滑動(dòng)到相對(duì)位置。smoothScrollBy(int dx, int dy)方法間接調(diào)用的smoothScrollBy(int dx,
int dy, Interpolator interpolator)方法,參數(shù)interpolator為插值器,它是一個(gè)接口,和動(dòng)畫使用的插值器一樣。
常用的有LinearInterpolator(線性插值器)、 AccelerateInterpolator(加速插值器) 、DecelerateInterpolator(減速
插值器)等。
在滑動(dòng)之前會(huì)先通過LayoutManager來判斷是橫向滑動(dòng)或垂直滑動(dòng),如果是橫向滑動(dòng)則取(dx,0)傳遞到
scrollByInternal方法中,反之垂直則取(0,dy)。
在這個(gè)方法的最后調(diào)用了mViewFlinger的smoothScrollBy方法。
OverScroller對(duì)像,這個(gè)類封裝了滑動(dòng)的能力,它可以超過滑動(dòng)邊界。它是新版本引入用來替換
android.widget.Scroller類的。
OverScroller和Scroller一樣,先通過調(diào)用startScroll(int startX, int startY, int dx, int dy, int duration)方法來設(shè)置
要滑動(dòng)的新位置相關(guān)參數(shù):
startX和startY表示滑動(dòng)的起點(diǎn)位置,當(dāng)startX為正值,View內(nèi)容會(huì)向左邊滑動(dòng),反之向右邊滑動(dòng);當(dāng)startY為
正值,View內(nèi)容會(huì)向上邊滑動(dòng),反之向下邊滑動(dòng)。 dx和dy表示滑動(dòng)的距離,當(dāng)dx為正值,View內(nèi)容會(huì)向左邊
滑動(dòng),反之向右邊滑動(dòng);當(dāng)dy為正值,View內(nèi)容會(huì)向上邊滑動(dòng),反之向下邊滑動(dòng)。 duration表示的是滑動(dòng)時(shí)
間,整個(gè)滑動(dòng)過程完成所需要的時(shí)間。
當(dāng)設(shè)置新位置參數(shù)后,再調(diào)用computeScrollOffset方法:
該方法主要是根據(jù)時(shí)間的流逝來計(jì)算當(dāng)前的位置(mCurrentPosition),當(dāng)返回true時(shí),表示滑動(dòng)還未結(jié)束,否
則結(jié)束。
最后的postOnAnimation()方法,是將ViewFlinger線程post到主線程中去執(zhí)行,當(dāng)開始運(yùn)行ViewFlinger線程
時(shí),會(huì)調(diào)用ViewFlinger的run()方法:
RecyclerView調(diào)用invalidate()方法,會(huì)重新執(zhí)行draw過程,并不會(huì)執(zhí)行measure和layout過程。
最后,就是通過這樣不斷的計(jì)算新位置然后重繪實(shí)現(xiàn)了平滑滑動(dòng)的效果。
總結(jié):
雖然RecyclerView提供了scrollTo()方法,但是并沒有提供scrollTo()方法的具體實(shí)現(xiàn),而是使用scrollToPosition()方法來代替。
scrollBy()和smoothScrollBy()都是通過指定相對(duì)位置來滑動(dòng),而scrollToPosition()和smoothScrollToPosition()方法是通過RecyclerView中的position來滑動(dòng),其中smoothScrollBy()和smoothScrollToPosition()方法實(shí)現(xiàn)了平滑滑動(dòng)的效果。
雖然smoothScrollBy()和smoothScrollToPosition()方法都實(shí)現(xiàn)了平滑滑動(dòng)的效果,但是它們的實(shí)現(xiàn)方式是不一樣的。smoothScrollBy()方法是通過
OverScroller類實(shí)現(xiàn)的,而smoothScrollToPosition()是通過SmoothScroller類實(shí)現(xiàn)的。
scrollBy(),scrollToPosition()和smoothScrollToPosition()方法都是通過LayoutManager來計(jì)算位置的,只有smoothScrollBy()是通過OverScroller來計(jì)算位置。
使用scrollBy(),smoothScrollBy()和smoothScrollToPosition()方法滑動(dòng)到指定位置,只會(huì)重新執(zhí)行draw過程,而scrollToPosition()方法滑動(dòng)到指定位置,會(huì)重新執(zhí)行measure,layout,draw過程,這將是一個(gè)消耗性能的操作,所以建議不使用。
RecyclerView基礎(chǔ)知識(shí):
1 recyclerView.setLayoutManager(new
LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));
它有三個(gè)參數(shù),第一個(gè)參數(shù)是上下文,第二個(gè)參數(shù)表示是水平布局還是垂
直布局,第三個(gè)參代表含義是:數(shù)據(jù)是否是反轉(zhuǎn)(如:先是0,1,2反轉(zhuǎn)后
就是2,1,0)
2 rv.setLayoutManager(new
GridLayoutManager(this,3,GridLayoutManager.HORIZONTAL,false));
這里的3代表是幾行或者幾列(水平布局就是行,垂直布局就是列)