問題
如果你又看過 cheesesquare 這個項(xiàng)目就知道,在詳情頁滑動的時候有一些粘性踩验,體驗(yàn)不是很好琴锭。
有人在YouTube上上傳了現(xiàn)象 視頻地址
stackoverflow上也有人討論這個問題,視頻也是在這個問題下面看到的厕九。
前段時間在項(xiàng)目用到 AppBarLayout 加 RecyclerView的時候地回,產(chǎn)品經(jīng)理和設(shè)計(jì)師對這個效果都不滿意俊鱼。
so....只能填坑了畅买。
初步解決
stackoverflow 上也有提及這個問題主要是由于 consumed 有時候在 onNestedFling 中計(jì)算不對導(dǎo)致的。
因此可以重寫AppBarLayout的Behavior
這個答案可以解決這個問題 http://stackoverflow.com/a/32454407
當(dāng)然記得在xml 為 AppBarLayout 設(shè)置上自定義的Behavior
更進(jìn)一步解決
還有一種情況可能體驗(yàn)不是很好帝火,就是在 往上 fling 的時候湃缎,AppBarLayout沒有拉下來,需要在拉一次才能下來九巡,那時產(chǎn)品經(jīng)理對這個也不是很滿意蹂季。
這種情況下 consumed 的值為 true 即時經(jīng)過修正之后也是為 true ,然后在看
super.onNestedFling 源碼 發(fā)現(xiàn)這時候也是不會調(diào)用 fling 的撒汉。事實(shí)上大部分這時候 AppBarLayout 不去fling也是對的父能,因?yàn)檫@時候 AppBarLayout 應(yīng)該在可見的視圖之外何吝。
于是后來打算去監(jiān)聽 RecyclerView的滾動鹃唯,在滾動到第一條的時候展開 AppBarLayout,發(fā)現(xiàn)效果還不錯
list.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int firstVisiblePosition = layoutManager.findFirstCompletelyVisibleItemPosition();
if (firstVisiblePosition == 0) {
appbar.setExpanded(true, true);
}
}
}});
這時候滾動到頂部的時候黔酥,RecyclerView 有個波紋效果洪橘,導(dǎo)致看起來比較別扭,
給 RecyclerView 設(shè)置以下屬性即可
android:overScrollMode="never"
其他方案
github 上有個庫也是解決這個問題的 smooth-app-bar-layout
當(dāng)然解決的原理跟本文相差甚遠(yuǎn)渣玲,有興趣可以閱讀下弟晚,我自己也有用過逾苫,不過這個庫比較蛋疼的就是得為RecyclerView 設(shè)置一個 head item铅搓, 這個 item 的高度必須跟 AppBarLayout 一樣的高度搀捷,所以對于 wrap_content 就比較麻煩了,當(dāng)然嫩舟,這個跟這個庫的實(shí)現(xiàn)思路有關(guān)系至壤。
最后,希望本文能給準(zhǔn)備入坑的同學(xué)少走一點(diǎn)彎路