認(rèn)識(shí)Behavior
使用CoordinatorLayout時(shí),會(huì)在xml文件中用它作為根布局,并給相應(yīng)的子View添加一個(gè)類似app:layout_behavior="@string/appbar_scrolling_view_behavior"的屬性,當(dāng)然屬性值也可以是其它的。進(jìn)一步可以發(fā)現(xiàn)@string/appbar_scrolling_view_behavior的值是android.support.design.widget.AppBarLayout$ScrollingViewBehavior,不就是support包下一個(gè)類的路徑嘛!玄機(jī)就在這里,通過(guò)CoordinatorLayout之所以可以實(shí)現(xiàn)炫酷的交互效果,Behavior功不可沒(méi)。既然如此,我們也可以自定義Behavior,來(lái)定制我們想要的效果。
自定義Behavior可以選擇重寫以下的幾個(gè)方法有:
-
onInterceptTouchEvent():是否攔截觸摸事件 -
onTouchEvent():處理觸摸事件 -
layoutDependsOn():確定使用Behavior的View要依賴的View的類型 -
onDependentViewChanged():當(dāng)被依賴的View狀態(tài)改變時(shí)回調(diào) -
onDependentViewRemoved():當(dāng)被依賴的View移除時(shí)回調(diào) -
onMeasureChild():測(cè)量使用Behavior的View尺寸 -
onLayoutChild():確定使用Behavior的View位置 -
onStartNestedScroll():嵌套滑動(dòng)開(kāi)始(ACTION_DOWN),確定Behavior是否要監(jiān)聽(tīng)此次事件 -
onStopNestedScroll():嵌套滑動(dòng)結(jié)束(ACTION_UP或ACTION_CANCEL) -
onNestedScroll():嵌套滑動(dòng)進(jìn)行中,要監(jiān)聽(tīng)的子View的滑動(dòng)事件已經(jīng)被消費(fèi) -
onNestedPreScroll():嵌套滑動(dòng)進(jìn)行中,要監(jiān)聽(tīng)的子View將要滑動(dòng),滑動(dòng)事件即將被消費(fèi)(但最終被誰(shuí)消費(fèi),可以通過(guò)代碼控制) -
onNestedFling():要監(jiān)聽(tīng)的子View在快速滑動(dòng)中 -
onNestedPreFling():要監(jiān)聽(tīng)的子View即將快速滑動(dòng)
當(dāng)你在onStartNestedScroll()中返回了true之后,嵌套滾動(dòng)進(jìn)入兩個(gè)階段:
onNestedPreScroll() 會(huì)在scrolling View獲得滾動(dòng)事件前調(diào)用,它允許你消費(fèi)部分或者全部的事件信息。
onNestedScroll() 會(huì)在scrolling View做完滾動(dòng)后調(diào)用,通過(guò)回調(diào)可以知道scrolling view滾動(dòng)了多少和它沒(méi)有消耗的滾動(dòng)事件。