CoorinatorLayout是官方号称的一种功能十分强大的FrameLayout(注意最新的实现是ViewGroup),主要有以下的两种基本应用场景:
1. 作为应用的顶层装饰布局;
2. 作为协调有交互依赖的子View的容器。
用法
CoorinatorLayout已流行了好一段时间,抽屉型Toolbar布局则是很经典的样例,推荐Mastering the Coordinator Layout,其布局的精简结构如下:
<CoordinatorLayout> <AppbarLayout/> <scrollableView/> </CoordinatorLayout>在该文中AppBarLayout作为抽屉Toolbar的容器,NestedScrollView作为内容页容器,通过NestedScrollView的滑动来触发Toolbar的伸缩与折叠,而CoorinatorLayout则作为上述两子View的容器,负责协调这两者的交互事件。
- 事实上NestedScrollView就是AppBarLayout的依赖,在没有CoorinatorLayout前,实现上述功能处理其滑动事件会比较繁琐,搞不好这些组件都存在耦合,扩展差的问题。
- 在该场景中CoorinatorLayout借助于Behavior,比较清晰地实现了这些组件间的解耦。Behavior已预定好了如下的常见的事件回调场景:

大多数方法都很常见,本文不再详细介绍。本文关注两个方法:
public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) { return false; } public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) { return false; }以上述AppBarLayout与NestedScrollView为例,AppBarLayout就是child,NestedScrollView就是dependency。在View的layout阶段,先回调layoutDependsOn方法来决定是否触发onDependentViewChanged,进而实现AppBarLayout跟随NestedScrollView滑动实现抽屉效果。
- 当理解了CoordinatorLayout最核心的Behavior后,就可以是自定义各种Behavior实现非常炫酷的交互效果。实际上,在Android support包下就有许多Behavior的身影:

CoorinatorLayout布局特性
在前面的例文中,还涉及到CoorinatorLayout比较特殊的布局属性layout_anchor与layout_anchorGravity,用法如下
<android.support.design.widget.FloatingActionButton android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_margin="@dimen/activity_horizontal_margin" android:src="@drawable/ic_comment_24dp" app:layout_anchor="@id/main.appbar" app:layout_anchorGravity="bottom|right|end" />- layout_anchor与layout_anchorGravity是用于设置CoorinatorLayout中直接子View的位置关系。在例子中FloatingActionButton是以AppBarLayout作为基准参照物,位于AppBarLayout中的右下角。
- 关于CoorinatorLayout的其它特性用法可以参考此样例
原理
- 当了解了CoorinatorLayout的用法后,再去探索CoorinatorLayout是如何实现协调的功能就比较顺利了。
- Behavior就是CoorinatorLayout为实现协调子View的布局而分离出的接口层,预定了mesure、layout、touch、scroll和fling等事件回调方法,使得有交互依赖的子View只需实现关注自己业务相关的回调事件,实现子View间的解耦。
- Behavior另一个好处是将能将View的部分回调方法分离出来,通过自定义Behavior,在CoorinatorLayout的协调下改写某个View的行为。因为Behavior的独立性,可以复用Behavior。
- CoorinatorLayout的实现本质上就是围绕Behavior中的各种方法,通过监听View中的多种事件,来触发这些方法的回调,整个CoorinatorLayout保持着较高的独立性。
总结
- 减轻了实现多个Child View间炫酷联动效果的成本
- Behavior的设计理念是降低View间耦合的典范,值得借鉴。
- CoorinatorLayout的局限性在于Behavior所支持的事件回调方法。
CoordinatorLayout是一种功能强大的ViewGroup,常用于实现复杂交互。它通过Behavior协调子View,如在滑动事件中使AppBarLayout与NestedScrollView联动。Behavior接口提供事件回调,允许自定义View行为,降低耦合。此外,layout_anchor和layout_anchorGravity属性帮助设置子View相对位置,实现灵活布局。

1608

被折叠的 条评论
为什么被折叠?



