目录
CoordinatorLayout 的作用
CoordinatorLayout 的功能
1 处理子控件之间依赖下的交互
2 处理子控件之间的嵌套滑动
3 处理子控件的测量与布局
4 处理子控件的事件拦截与响应
CoordinatorLayout 下的事件传递机制
CoordinatorLayout 协调者布局。
CoordinatorLayout 的作用
作为应用的顶层布局。
作为一个管理容器,管理自己与子 view 或者子 view 之间的交互。
CoordinatorLayout 的功能
1 处理子控件之间依赖下的交互
当 CoordinatorLayout 中子控件 depandency 的位置、大小等发生改变的时候,那么在 CoordinatorLayout 内部会通知所有依赖 depandency 的控件,并调用对应声明的 Behavior,告知其依赖的 depandency 发生改变。
如何判断依赖?
通过 layoutDependsOn() 方法判断。
接收到通知后如何处理?
onDependentViewChange() / onDependentViewRemoved(),这些都交由 Behavior 来处理。
注意:CoordinatorLayout 的依赖交互原理是一种观察者模式 ,可以这样理解,正常思维是 child1、child2 观察 parent是否改变。但在 android 代码是这样实现的,即 parent 通知 child1、child2 说发生了改变。
2 处理子控件之间的嵌套滑动
CoordinatorLayout 实现嵌套滑动是1 : N,而NestedScrolling 是 1 :1。CoordinatorLayout 只能作为父容器;NestedScrollView 即可作父容器,也可作为子 view。
CoordinatorLayout 实现了 NestedScrollingParent2 接口。那么当事件 scroll 或 fling 产生后,内部实现了 NestedScrollingChild 接口的子控件会将事件分发给 CoordinatorLayout,CoordinatorLayout 又会将事件传递给 Behavior。然后在 Behavior 中实现子控件的嵌套滑动。
产生事件 scroll 或 fling 的控件必须是 CoordinatorLayout 的直接子 View 吗?
答:不是
3 处理子控件的测量与布局
CoordinatorLayout 主要负责的是子控件之间的交互,内部控件的测量与布局,都非常简单。在特性的情况下,如子控件需要处理宽高和布局的时候,那么交由 Behavior 内部的 onMeasureChild 与 onLayoutChild 方法来处理。
4 处理子控件的事件拦截与响应
对于事件的拦截与处理,如果子控件需要拦截并消耗事件,那么交由给 Behavior 内部的 onInterceptTouchEvent() 与 onTouchEvent() 方法进行处理。
以上4个功能,都建立于 CoordinatorLayout 中提供的一个叫 Behavior 的“插件”之上。Behavior 内部也提供了响应方法来对应这4个不同的功能。使用不同的 Behavior 产生不同的行为。
CoordinatorLayout 下的事件传递机制
问题(待完善):
为什么在依赖的控件下设置一个 behavior,DepandedView位置发生改变的时候就能通知依赖方?
答:通过 Attach 里面监听 onPreView,当 onDependentViewChanged 发生变化的时候就会去通知到
Behavior 是在哪儿实例化的?
答:
CoordinatorLayout 是如何区分谁依赖于谁的?
答:onMeasure 收集
什么时候需要重写 onMeasureChild?
答:
什么时候需要重写 onLayoutChild?
答: