前言
衆所周知,ScrollView
與NestedScrollView
都是用來滑動的控件,但是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())