CoorinatorLayout协调者布局

CoorinatorLayout是官方号称的一种功能十分强大的FrameLayout(注意最新的实现是ViewGroup),主要有以下的两种基本应用场景:
1. 作为应用的顶层装饰布局;
2. 作为协调有交互依赖的子View的容器。

用法

  1. CoorinatorLayout已流行了好一段时间,抽屉型Toolbar布局则是很经典的样例,推荐Mastering the Coordinator Layout,其布局的精简结构如下:

    <CoordinatorLayout>
        <AppbarLayout/>
        <scrollableView/>
    CoordinatorLayout>
  2. 在该文中AppBarLayout作为抽屉Toolbar的容器,NestedScrollView作为内容页容器,通过NestedScrollView的滑动来触发Toolbar的伸缩与折叠,而CoorinatorLayout则作为上述两子View的容器,负责协调这两者的交互事件。

  3. 事实上NestedScrollView就是AppBarLayout的依赖,在没有CoorinatorLayout前,实现上述功能处理其滑动事件会比较繁琐,搞不好这些组件都存在耦合,扩展差的问题。
  4. 在该场景中CoorinatorLayout借助于Behavior,比较清晰地实现了这些组件间的解耦。Behavior已预定好了如下的常见的事件回调场景:
    CoorinatorLayout协调者布局_第1张图片
  5. 大多数方法都很常见,本文不再详细介绍。本文关注两个方法:

    public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) {
            return false;
        }
    
    public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) {
            return false;
        }
  6. 以上述AppBarLayout与NestedScrollView为例,AppBarLayout就是child,NestedScrollView就是dependency。在View的layout阶段,先回调layoutDependsOn方法来决定是否触发onDependentViewChanged,进而实现AppBarLayout跟随NestedScrollView滑动实现抽屉效果。

  7. 当理解了CoordinatorLayout最核心的Behavior后,就可以是自定义各种Behavior实现非常炫酷的交互效果。实际上,在Android support包下就有许多Behavior的身影:
    CoorinatorLayout协调者布局_第2张图片

CoorinatorLayout布局特性

  1. 在前面的例文中,还涉及到CoorinatorLayout比较特殊的布局属性layout_anchor与layout_anchorGravity,用法如下

    .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"
        />
  2. layout_anchor与layout_anchorGravity是用于设置CoorinatorLayout中直接子View的位置关系。在例子中FloatingActionButton是以AppBarLayout作为基准参照物,位于AppBarLayout中的右下角。
  3. 关于CoorinatorLayout的其它特性用法可以参考此样例

原理

  1. 当了解了CoorinatorLayout的用法后,再去探索CoorinatorLayout是如何实现协调的功能就比较顺利了。
  2. Behavior就是CoorinatorLayout为实现协调子View的布局而分离出的接口层,预定了mesure、layout、touch、scroll和fling等事件回调方法,使得有交互依赖的子View只需实现关注自己业务相关的回调事件,实现子View间的解耦。
  3. Behavior另一个好处是将能将View的部分回调方法分离出来,通过自定义Behavior,在CoorinatorLayout的协调下改写某个View的行为。因为Behavior的独立性,可以复用Behavior。
  4. CoorinatorLayout的实现本质上就是围绕Behavior中的各种方法,通过监听View中的多种事件,来触发这些方法的回调,整个CoorinatorLayout保持着较高的独立性。

总结

  1. 减轻了实现多个Child View间炫酷联动效果的成本
  2. Behavior的设计理念是降低View间耦合的典范,值得借鉴。
  3. CoorinatorLayout的局限性在于Behavior所支持的事件回调方法。

你可能感兴趣的:(Android)