认识Behavior
使用CoordinatorLayout时,会在xml文件中用它作为根布局,并给相应的子View添加一个类似app:layout_behavior="@string/appbar_scrolling_view_behavior"的属性,当然属性值也可以是其它的。进一步可以发现@string/appbar_scrolling_view_behavior的值是android.support.design.widget.AppBarLayout$ScrollingViewBehavior,不就是support包下一个类的路径嘛!玄机就在这里,通过CoordinatorLayout之所以可以实现炫酷的交互效果,Behavior功不可没。既然如此,我们也可以自定义Behavior,来定制我们想要的效果。
自定义Behavior
可以选择重写以下的几个方法有:
-
onInterceptTouchEvent()
:是否拦截触摸事件 -
onTouchEvent()
:处理触摸事件 -
layoutDependsOn()
:确定使用Behavior
的View
要依赖的View
的类型 -
onDependentViewChanged()
:当被依赖的View
状态改变时回调 -
onDependentViewRemoved()
:当被依赖的View
移除时回调 -
onMeasureChild()
:测量使用Behavior
的View
尺寸 -
onLayoutChild()
:确定使用Behavior
的View
位置 -
onStartNestedScroll()
:嵌套滑动开始(ACTION_DOWN
),确定Behavior
是否要监听此次事件 -
onStopNestedScroll()
:嵌套滑动结束(ACTION_UP
或ACTION_CANCEL
) -
onNestedScroll()
:嵌套滑动进行中,要监听的子View
的滑动事件已经被消费 -
onNestedPreScroll()
:嵌套滑动进行中,要监听的子View
将要滑动,滑动事件即将被消费(但最终被谁消费,可以通过代码控制) -
onNestedFling()
:要监听的子View
在快速滑动中 -
onNestedPreFling()
:要监听的子View
即将快速滑动
当你在onStartNestedScroll()中返回了true之后,嵌套滚动进入两个阶段:
onNestedPreScroll() 会在scrolling View获得滚动事件前调用,它允许你消费部分或者全部的事件信息。
onNestedScroll() 会在scrolling View做完滚动后调用,通过回调可以知道scrolling view滚动了多少和它没有消耗的滚动事件。