前言
眾所周知,ScrollView
與NestedScrollView
都是用來滑動(dòng)的控件,但是ScrollView
沒有提供滑動(dòng)監(jiān)聽的接口菌湃,需要我們自己去實(shí)現(xiàn)慌烧,而NestedScrollView
提供了一個(gè)setOnScrollChangeListener
方法用來監(jiān)聽我們的滑動(dòng)事件,此接口一共有5個(gè)參數(shù)匆瓜,作用如下:
- NestedScrollView view 返回本身奔则,這個(gè)不用多說
- scrollX 當(dāng)前橫向滑動(dòng)的距離
- scrollY 當(dāng)前垂直滑動(dòng)的距離
- oldScrollX 上一次停止后橫向滑動(dòng)的距離
- oldScrollY 上一次停止后垂直滑動(dòng)的距離
注:這些距離都是以px作為單位,實(shí)際使用注意進(jìn)行px/dp轉(zhuǎn)換
技巧1:獲取總滑動(dòng)距離與滑動(dòng)比例
有人說蛮寂,這還不簡(jiǎn)單蔽午,直接調(diào)用NestedScrollView.getMeasuredHeight()
不就可以了易茬,然后與scrollY
一除,滑動(dòng)比就出來了及老,我只想說:too young too simple
事實(shí)上,NestedScrollView.getMeasuredHeight()
獲取的只是當(dāng)前顯示出來的一屏的測(cè)量高度(不包括未滑動(dòng)出來的距離),真正的總高度應(yīng)該調(diào)用NestedScrollView.getChildAt(0).getMeasuredHeight()
來獲取,需要注意抽莱,這是控件高度,不是滑動(dòng)高度,不要傻白甜的用這個(gè)與scrollY 去除獲取滑動(dòng)比例,如果這樣做的說明你對(duì)scrollY
這個(gè)參數(shù)理解不夠骄恶,這個(gè)參數(shù)是代表的滑動(dòng)距離食铐,在滑動(dòng)之前已經(jīng)是有一屏的距離了,所以它們之間的關(guān)系可以表示為:
此處用M代表 NestedScrollView.getMeasuredHeight()僧鲁,CM代表NestedScrollView.getChildAt(0).getMeasuredHeight()
- 當(dāng)滑動(dòng)到底部: scrollY + M = CM
- 總滑動(dòng)距離 = CM-M
- 當(dāng)前滑動(dòng)的比例 = scrollY / 總滑動(dòng)距離
- 完整比例公式: scrollY/(CM-M)
需要注意的是虐呻,如果給NestedScrollView
設(shè)置了padding,那么M還需要減去padding的數(shù)值
獲取到了滑動(dòng)百分比,我們就能用它來控制文字大小寞秃,位置斟叼,透明度等等,從而實(shí)現(xiàn)一些酷炫的效果
技巧2:獲取滑動(dòng)狀態(tài)
理解了滑動(dòng)距離與總滑動(dòng)長(zhǎng)度之前的關(guān)系春寿,這種判斷還不是手到擒來
滑動(dòng)到了頂部或底部
頂部: scrollY = 0即為滑動(dòng)到了頂部
底部:
第一種:先獲取滑動(dòng)比例(見技巧1),等于1就說明滑動(dòng)到了底部
第二種:
if(scrollY == NestedScrollView.getChildAt(0).getMeasuredHeight()- NestedScrollView.getMeasuredHeight()){
//滑動(dòng)到了底部,注意如果有padding設(shè)置還需要減去一個(gè)padding的數(shù)值
}
原理其實(shí)都一樣
上滑下滑
if (scrollY > oldScrollY){
//上滑
}else{
//下滑
}
技巧3:控制滑動(dòng)
自動(dòng)滑動(dòng)到底部:
NestedScrollView.fullScroll(NestedScrollView.FOCUS_DOWN)
自動(dòng)滑動(dòng)到頂部:
NestedScrollView.fullScroll(NestedScrollView.FOCUS_UP)
滑動(dòng)到某個(gè)位置
scrollTo() //跳轉(zhuǎn)到指定位置朗涩,無滑動(dòng)效果
scrollBy() //從當(dāng)前位置再偏移到指定位置,無滑動(dòng)效果
smoothScrollTo() //與scrollTo效果相同,但添加了滑動(dòng)動(dòng)畫效果
smoothScrollBy() //同理
而位置的信息可以通過view.getTop(),view.getBottom()
等方法獲取控件的坐標(biāo)信息,例如绑改,滑動(dòng)到指定view的上方:
NestedScrollView.scrollTo(0,view.getTop())