NestedScrolling機制(能夠稱爲嵌套滾動或嵌套滑動)可以讓父view和子view在滾動時進行配合,其基本流程以下:spa
要實現這樣的交互,父View須要實現NestedScrollingParent接口,而子View須要實現NestedScrollingChild接口。.net
在這套交互機制中,child是動做的發起者,parent只是接受回調並做出響應。code
另外: 父view和子view並不須要是直接的父子關係,即若是「parent1包含parent2,parent2包含child」,則parent1和child仍能經過nestedScrolling機制進行交互。blog
關於動做的方法大概能夠分紅兩類繼承
第一類:主要實現通用的的關聯動做,各類view的改變均可以使用。接口
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency)
第二類:主要實現滾動的動做ci
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) public void onNestedScrollAccepted(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target) public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) public boolean onNestedFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY, boolean consumed) public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY)
方法之間的具體對應關係以下:get
子(發起者) | 父(被回調) |
---|---|
startNestedScroll | onStartNestedScroll、onNestedScrollAccepted |
dispatchNestedPreScroll | onNestedPreScroll |
dispatchNestedScroll | onNestedScroll |
stopNestedScroll | onStopNestedScroll |
流程源碼
能夠大體將嵌套滾動的流程歸納以下(以觸摸滾動爲例,慣性滾動(fling)的流程與此相似):it
其餘
一、要關聯滾動的View須要實現NestedScrollingChild接口,並在用NestedScrollingChildHelper輔助類處理相應的回調 二、須要關聯滾動的View的父View須要實現NestedScrollingParent接口,可用NestedScrollingParentHelper輔助類處理相應的回調,並在相應的回調方法中處理動做 三、自定義Behavior要繼承CoordinatorLayout.Behavior<V extends View> 四、CoordinatorLayout的直接子類設置layout_behavior屬性纔有效果(CoordinatorLayout會循環調用每一個子view的behavior)
參考:
NestedScrolling機制(一)——概述 http://blog.csdn.net/al4fun/article/details/53888990 源碼看CoordinatorLayout.Behavior原理 http://blog.csdn.net/qibin0506/article/details/50377592