上次自己做了個簡單的RecyclerView+SwipeRefrashLayou滑動demo,做完后又給加了個隱藏的效果。
需要學(xué)習(xí)RecyclerView的請查看我上篇博客http://www.itdecent.cn/p/68777233c6db
demo源碼在:https://github.com/wapchief/android-CollectionDemo
看一下效果圖。

這樣設(shè)計(jì)有利于發(fā)揮手機(jī)屏幕的利用空間,如果首頁內(nèi)容較多的時候,不影響體驗(yàn)。
所有的操作都是在RecyclerView監(jiān)聽方法的onScrolled方法里實(shí)現(xiàn)。
直接看該方法的官方介紹:
/**
* Callback method to be invoked when the RecyclerView has been scrolled. This will be
* called after the scroll has completed.
* <p>
* This callback will also be called if visible item range changes after a layout
* calculation. In that case, dx and dy will be 0.
*
* @param recyclerView The RecyclerView which scrolled.
* @param dx The amount of horizontal scroll.
* @param dy The amount of vertical scroll.
*/
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
}
意思是說放Recyclerview發(fā)生滾動的時候,該方法一直被調(diào)用。所有因滾動所產(chǎn)生的狀態(tài)改變都在這里實(shí)現(xiàn)。
所以因滾動產(chǎn)生的視圖狀態(tài)改變也在這個方法內(nèi)。
上篇文章,在該方法內(nèi)實(shí)現(xiàn)滾動到底部自動加載的方法,思路是一個頁面內(nèi)item的個數(shù),當(dāng)加載完后,就執(zhí)行再加載一條數(shù)據(jù)。
現(xiàn)在我們要獲取滑動的距離
怎么做?
onScrolled提供了一個dx,dy的方法。
但是該方法只能判定一次性滑動的距離,dx是橫向,dy是縱向。
而且默認(rèn)停滯狀態(tài)距離是0,如果要向上返回滑動,那么就會變成負(fù)數(shù)。也就是每一次滑動,只要停滯,距離都會重新計(jì)算。
所以我們只能重新定義一個方法,用來計(jì)算整體滑動的距離
public int getScollYDistance() {
int position = layoutManager.findFirstVisibleItemPosition();
View firstVisiableChildView = layoutManager.findViewByPosition(position);
int itemHeight = firstVisiableChildView.getHeight();
return (position) * itemHeight - firstVisiableChildView.getTop();
}
LinearLayoutManager提供了獲取第一條item可見位置的方法。
然后通過findviewby實(shí)例化。
然后再用getHeight獲取item的高度。
最后計(jì)算得出實(shí)際的child。
獲取了child之后,我們就可以在onScolled方法根據(jù)距離進(jìn)行操作
if (getScollYDistance() <= 0) {
//靜止并處于最頂端狀態(tài)
tvTitle.setBackgroundColor(black_transparent);
tvTitle.setTextColor(white);
tvTitle.setVisibility(View.VISIBLE);
} else if (getScollYDistance() > 0 && getScollYDistance() <= 400) {//滑動在0-400距離的時候
if (getScollYDistance() <= 200) {//處于滑動到中間的時候
tvTitle.setTextColor(blue);
} else {//滑出到200以外
// tvTitle.setBackgroundColor(Color.argb((int) 255, 254, 184, 6));
tvTitle.setTextColor(white);
}
float scale = (float) getScollYDistance() / 400;
float alpha = (255 * scale);
// 只是layout背景透明(仿知乎滑動效果)
tvTitle.setBackgroundColor(Color.argb((int) alpha, 254, 184, 6));
} else {
tvTitle.setVisibility(View.GONE);
}
這里的數(shù)值是以像素px為單位。在這里可以根據(jù)距離在指定的位置設(shè)置想要的效果。
其中
float scale = (float) getScollYDistance() / 400;
float alpha = (255 * scale);
// 只是layout背景透明(仿知乎滑動效果)
tvTitle.setBackgroundColor(Color.argb((int) alpha, 254, 184, 6));
就是設(shè)置從全部到透明的方法。或者是反過來。
具體需要什么效果自己diy吧。項(xiàng)目我發(fā)到了github,歡迎star
https://github.com/wapchief/android-CollectionDemo
新手上路歡迎指導(dǎo)!