原文 http://blog.csdn.net/snailbaby_soko/article/details/77863995
狀態(tài)欄漸變
先上圖看效果
最近公司項目做了這個效果碴犬,有時間整理下分享給大家肝断,為大家提供些思路
目前很多 app 都會有這個效果构回,狀態(tài)欄隨著可滾動的控件滑動的時候漸變陈惰。
實現(xiàn)的辦法更是各有千秋,可以
- 用 CoordinatorLayout 自定義下 behavior
- 用 ScrollView 監(jiān)聽滑動
- 用 RecyclerView 監(jiān)聽滑動
- 用別人封裝的庫
其中的取舍就要結合自己的項目和實際情況了禀挫。
但是為了實現(xiàn)功能的低侵入性旬陡,我們往往不建議直接引用封裝的庫,
因為項目的需求不一樣语婴,作者可能考慮的范圍并沒有切合自己描孟,出了bug
就很難調試和解決了。
實現(xiàn)思路
View.setAlpha(x);
整個功能需求就為了這個方法展開了砰左。很簡單吧匿醒,那么怎么獲取到漸變的 x
漸變的 x
RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
看到這里,相信大家都知道了缠导,就是利用滑動時的 dy廉羔。
但是這里的 dy 打印出來可能會很懵逼,下滑的時候它的值大概是這樣的
dy --> 7
dy --> 12
dy --> 19
dy --> 12
dy --> 13
dy --> 13
dy --> 11
dy --> 9
dy --> 12
dy --> 7
dy --> 3
dy --> 1
上滑就為負數(shù)僻造,正負代表了方向就很好理解了憋他。
但這是什么鬼...它漸變沒有規(guī)律啊
按我的理解,其實它代表的就是此次滑動 加速度 ...
為什么這樣理解呢髓削,因為這個值的變化最后總是趨近于0竹挡,而且開始是隨著你滾動的速度的大小
而決定起始速度的。就好比你用多大的力氣推一個輪胎立膛,不管它會滾多遠多久此迅,但最后都會停下來一樣。
但是我們要知道輪胎滾了多遠旧巾,在代碼的世界里就沒必要考慮太多因素了,就只需要累計一下這個 dy 就
足夠了忍些,因為它下滑就為正上滑為負鲁猩,但是它們走過的路最終都可抵消。
整合
1.既然 dy 能產(chǎn)生漸變的 x
2.而且 x 能讓View產(chǎn)生漸變
這里就寫了這么一個布局罢坝,看層級估計一眼看懂了吧廓握,那個 ptrFrameLayout 是一個刷新的庫搅窿,這里使用
看看會不會導致沖突什么的,以便之后大家可以參考隙券,直接替換成自己使用的就好男应,親測可正常使用
箭頭指著的 View 就是我們漸變的豬腳了。
在監(jiān)聽里面這么處理一下 dy
實現(xiàn)后的效果圖娱仔。有了這個漸變的 x 大家還可以做更多的拓展
Github Demo 點這里询枚。