使用RecyclerView滑動時設(shè)置標(biāo)題欄漸變或隱藏效果

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

看一下效果圖。

wapchief.gif

這樣設(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)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡介: 提供一個讓有限的窗口變成一個大數(shù)據(jù)集的靈活視圖。 術(shù)語表: Adapter:RecyclerView的子類...
    酷泡泡閱讀 5,386評論 0 16
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評論 25 708
  • 華夏涌詩潮 古風(fēng)新韻傳佳句【華夏詩潮】 金秋翻墨浪 神筆妙心寫錦篇【依嵐聽雪】 -----------------...
    依嵐聽雪閱讀 323評論 0 0
  • 一個冬天,因患腎炎駐了一段時間醫(yī)院。在醫(yī)院里每天天不亮,燈就早早被打開,小推車的聲音在走廊里此起彼伏、嗡嗡作響,護(hù)...
    紫螳螂閱讀 456評論 4 1
  • 八 心存歡喜,到哪里都不孤寂。因?yàn)闅g喜著這個人間,走的越陌生就越浪漫。即便枯燥乏味,也找出新鮮的白天黑夜來...
    龍青閱讀 427評論 0 4

友情鏈接更多精彩內(nèi)容