詳解NestedScrollView滑動監聽中的一些判斷技巧

前言

衆所周知,ScrollViewNestedScrollView都是用來滑動的控件,但是ScrollView沒有提供滑動監聽的接口,需要我們自己去實現,而NestedScrollView提供了一個setOnScrollChangeListener方法用來監聽我們的滑動事件,此接口一共有5個參數,作用如下:

  • NestedScrollView view 返回本身,這個不用多說
  • scrollX 當前橫向滑動的距離
  • scrollY 當前垂直滑動的距離
  • oldScrollX 上一次停止後橫向滑動的距離
  • oldScrollY 上一次停止後垂直滑動的距離

注:這些距離都是以px作爲單位,實際使用注意進行px/dp轉換

技巧1:獲取總滑動距離與滑動比例

有人說,這還不簡單,直接調用NestedScrollView.getMeasuredHeight()不就可以了,然後與scrollY一除,滑動比就出來了,我只想說:too young too simple

事實上,NestedScrollView.getMeasuredHeight()獲取的只是當前顯示出來的一屏的測量高度(不包括未滑動出來的距離),真正的總高度應該調用NestedScrollView.getChildAt(0).getMeasuredHeight()來獲取,需要注意,這是控件高度,不是滑動高度,不要傻白甜的用這個與scrollY 去除獲取滑動比例,如果這樣做的說明你對scrollY這個參數理解不夠,這個參數是代表的滑動距離,在滑動之前已經是有一屏的距離了,所以它們之間的關係可以表示爲:

此處用M代表 NestedScrollView.getMeasuredHeight(),CM代表NestedScrollView.getChildAt(0).getMeasuredHeight()

  • 當滑動到底部: scrollY + M = CM
  • 總滑動距離 = CM-M
  • 當前滑動的比例 = scrollY / 總滑動距離
  • 完整比例公式: scrollY/(CM-M)

需要注意的是,如果給NestedScrollView設置了padding,那麼M還需要減去padding的數值

獲取到了滑動百分比,我們就能用它來控制文字大小,位置,透明度等等,從而實現一些酷炫的效果

技巧2:獲取滑動狀態

理解了滑動距離與總滑動長度之前的關係,這種判斷還不是手到擒來

滑動到了頂部或底部
頂部: scrollY = 0即爲滑動到了頂部
底部:
第一種:先獲取滑動比例(見技巧1),等於1就說明滑動到了底部
第二種: 
if(scrollY == NestedScrollView.getChildAt(0).getMeasuredHeight()- NestedScrollView.getMeasuredHeight()){
   //滑動到了底部,注意如果有padding設置還需要減去一個padding的數值
}

原理其實都一樣

上滑下滑
            if (scrollY > oldScrollY){
                //上滑
   
            }else{
               //下滑
            }

技巧3:控制滑動

自動滑動到底部:

NestedScrollView.fullScroll(NestedScrollView.FOCUS_DOWN)

自動滑動到頂部:

 NestedScrollView.fullScroll(NestedScrollView.FOCUS_UP)

滑動到某個位置

scrollTo() //跳轉到指定位置,無滑動效果
scrollBy() //從當前位置再偏移到指定位置,無滑動效果
smoothScrollTo() //與scrollTo效果相同,但添加了滑動動畫效果
smoothScrollBy() //同理

而位置的信息可以通過view.getTop(),view.getBottom()等方法獲取控件的座標信息,例如,滑動到指定view的上方:

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