NestedScrolling機制

作用

Android的事件分發(fā)機制無法實現(xiàn)流暢嵌套滑動,因為當(dāng)子控件消費了事件, 那么父控件就不會再有機會處理這個事件了阶剑。
嵌套滑動的相關(guān)邏輯作為普通方法直接寫進了最新的(SDK21之后)View和ViewGroup類虹蓄。而SDK21之前的版本,官方在android.support.v4兼容包中提供了兩個接口NestedScrollingChild和NestedScrollingParent, 還有兩個輔助類NestedScrollingChildHelper和NestedScrollingParentHelper來幫助控件實現(xiàn)嵌套滑動.

基本原理

嵌套滑動的基本原理是在子控件接收到滑動一段距離的請求時, 先詢問父控件是否要滑動, 如果滑動了父控件就通知子控件它消耗了一部分滑動距離, 子控件就只處理剩下的滑動距離, 然后子控件滑動完畢后再把剩余的滑動距離傳給父控件.
通過這樣的嵌套滑動機制, 在一次滑動操作過程中
父控件和子控件都有機會對滑動操作作出響應(yīng), 尤其父控件能夠分別在子控件處理滑動距離之前和之后對滑動距離進行響應(yīng).
這解決了事件分發(fā)機制缺點引起的問題.

NestedScrollingChild

startNestedScroll : 起始方法, 主要作用是找到接收滑動距離信息的外控件.
dispatchNestedPreScroll : 在內(nèi)控件處理滑動前把滑動信息分發(fā)給外控件.
dispatchNestedScroll : 在內(nèi)控件處理完滑動后把剩下的滑動距離信息分發(fā)給外控件.
stopNestedScroll : 結(jié)束方法, 主要作用就是清空嵌套滑動的相關(guān)狀態(tài)
setNestedScrollingEnabled和isNestedScrollingEnabled : 一對get&set方法, 用來判斷控件是否支持嵌套滑動.
dispatchNestedPreFling和dispatchNestedFling : 跟Scroll的對應(yīng)方法作用類似, 不過分發(fā)的不是滑動信息而是Fling信息.(這個Fling好難翻譯.. =。=)本文主要關(guān)注滑動的處理, 所以后續(xù)不分析這兩個方法.
從方法名就可以看出
內(nèi)控件是嵌套滑動的發(fā)起者.

NestedScrollingParent

因為內(nèi)控件是發(fā)起者, 所以外控件的大部分方法都是被內(nèi)控件的對應(yīng)方法回調(diào)的.
onStartNestedScroll : 對應(yīng)startNestedScroll, 內(nèi)控件通過調(diào)用外控件的這個方法來確定外控件是否接收滑動信息.
onNestedScrollAccepted : 當(dāng)外控件確定接收滑動信息后該方法被回調(diào), 可以讓外控件針對嵌套滑動做一些前期工作.
onNestedPreScroll : 關(guān)鍵方法, 接收內(nèi)控件處理滑動前的滑動距離信息, 在這里外控件可以優(yōu)先響應(yīng)滑動操作, 消耗部分或者全部滑動距離.
onNestedScroll : 關(guān)鍵方法, 接收內(nèi)控件處理完滑動后的滑動距離信息, 在這里外控件可以選擇是否處理剩余的滑動距離.
onStopNestedScroll : 對應(yīng)stopNestedScroll, 用來做一些收尾工作.
getNestedScrollAxes : 返回嵌套滑動的方向, 區(qū)分橫向滑動和豎向滑動, 作用不大
onNestedPreFling和onNestedFling : 同上略
外控件通過onNestedPreScroll和onNestedScroll來接收內(nèi)控件響應(yīng)滑動前后的滑動距離信息.
再次指出, 這兩個方法是實現(xiàn)嵌套滑動效果的關(guān)鍵方法.

參考

鏈接:http://www.reibang.com/p/0a71e7ca9716

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末魄眉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闷袒,更是在濱河造成了極大的恐慌坑律,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囊骤,死亡現(xiàn)場離奇詭異晃择,居然都是意外死亡,警方通過查閱死者的電腦和手機也物,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門宫屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滑蚯,你說我怎么就攤上這事浪蹂。” “怎么了告材?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵坤次,是天一觀的道長。 經(jīng)常有香客問我斥赋,道長缰猴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任疤剑,我火速辦了婚禮滑绒,結(jié)果婚禮上闷堡,老公的妹妹穿的比我還像新娘。我一直安慰自己蹬挤,他們只是感情好缚窿,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焰扳,像睡著了一般倦零。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吨悍,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天扫茅,我揣著相機與錄音,去河邊找鬼育瓜。 笑死葫隙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躏仇。 我是一名探鬼主播恋脚,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焰手!你這毒婦竟也來了糟描?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤书妻,失蹤者是張志新(化名)和其女友劉穎船响,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躲履,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡见间,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了工猜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片米诉。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖域慷,靈堂內(nèi)的尸體忽然破棺而出荒辕,到底是詐尸還是另有隱情,我是刑警寧澤犹褒,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弛针,受9級特大地震影響叠骑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜削茁,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一宙枷、第九天 我趴在偏房一處隱蔽的房頂上張望掉房。 院中可真熱鬧,春花似錦慰丛、人聲如沸卓囚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哪亿。三九已至,卻和暖如春贤笆,著一層夾襖步出監(jiān)牢的瞬間蝇棉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工芥永, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篡殷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓埋涧,卻偏偏與公主長得像板辽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棘催,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容