android嵌套滑動NestedScrolling

首先來看我門要做的效果:
效果圖
佈局是用一個linerLayout實現NestedScrollingParent 接口,然後裏面一次放了一個head,tablayout,viewpager,recyclerview。
NestedScrolling提供了一套父 View 和子 View 滑動交互機制。要完成這樣的交互,父 View 需要實現 NestedScrollingParent 接口,而子 View 需要實現 NestedScrollingChild 接口。

@Override
    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
        return true;
    }
    private boolean once=true;
    @Override
    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
        boolean hiddenTop = dy > 0 && getScrollY() < 780;
        boolean showTop = dy < 0 && getScrollY() > 0 && !ViewCompat.canScrollVertically(target, -1);
        if(hiddenTop && once){
            ViewGroup.LayoutParams layoutParams = getLayoutParams();
            layoutParams.height = getHeight()+780;
            setLayoutParams(layoutParams);
            requestLayout();
            once = false;
        }
        if (hiddenTop || showTop)
        {
            Log.i("way","scrolly"+getScrollY());
            scrollBy(0, dy);
            consumed[1] = dy;
            consumed[0] = dx;
        }
    }

在onStartNestedScroll返回true,這樣父view就可以和子view就可以一起配合處理滑動事件。
具體怎麼處理在onNestedPreScroll方法中寫,hiddenTop 和showTop 分別表示上滑掩藏head和下滑顯示head的時候,ViewCompat.canScrollVertically(target, -1)在這裏表示下滑的時候recyclerview是否滑動最頂部。如果是上滑掩藏head過程或者
下滑顯示head的時候把滑動事件交給父view處理然後通過scrollby滑動父view。第一次上滑由於父view佈局是填充整個窗口,所以會導致父view整體上移下面留出空白,所以在第一次上滑的時候應該增加父view的高度,代碼中的780是head的高度。

@Override
    public void scrollTo(int x, int y)
    {
        if (y < 0)
        {
            y = 0;
        }
        if (y > 780)
        {
            y = 780;
        }
        Log.i("way",y+"--"+getScrollY());
        if (y != getScrollY())
        {
            super.scrollTo(x, y);
        }
    }

最後還要重寫scrollTo方法避免滑動過快導致出現空白。
由於recyclerview本身實現了NestedScrollingChild,所以我們可以直接拿來用。如果你想用listview代替recyclerview需要自己實現NestedScrollingChild,在此 listview中需要包含一個 NestedScrollingChildHelper 輔助類。NestedScrollingChild接口的實現,基本上就是調用本 Helper 類的對應的函數即可,因爲 Helper 類中已經實現好了 Child 和 Parent 交互的邏輯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章