[Android Design Lib]CoordinatorLayout源码分析

参考文章:

1.MaterialDesign实现的下拉刷新动画

2.CoordinatorLayout调用原理源码解析

3.Android Material Design 控件常用的属性

一、要通过CoordinatorLayout来实现头部可折叠的级连动画效果的列表,其layout几乎一成不变地需要写为如下样式:


要素为:

1.1 CoordinatorLayout作为根布局,其下child节点有:AppBarLayout和可滚动的view如RecyclerView。

1.2 如果列表头部需要折叠效果,则AppBarLayout节点里,必不可少需要包含子节点CollapsingToolbarLayout,同时节点CollapsingToolbarLayout里必不可少需要包含Toolbar节点。

1.3 可滚动的view如RecyclerView,必不可少需要配置app:layout_behavior属性,而且取值固定为:

app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"
二、传统的动画和列表刷新的实现

在没出现CoordinatorLayout之前,我们想实现一个头部可以缩放的可刷新的列表时,该怎么实现?

无非是通过侦听listView的onTouch、onScroll事件,然后在回调里去重绘头部的各个view元素。

CoordinatorLayout的出现,仍然是遵循这一思路的,不同的是它对此过程进行了升级,使得代码的设计模式性更加突出,更加的接口化和可扩展化。不仅listView可以作为联动动作的源头,一切实现了接口类NestedScrollingChild的可滚动的View都可以作为联动动作的源头。

三、介绍CoordinatorLayout原理之前,首先要介绍几个角色类:

1.接口NestedScrollingParent,其方法有:


2.内部类CoordinatorLayout$Behavior,其原型为:

public static abstract class Behavior<V extends View>
是一个抽象类,主要的方法有:


可以看到,抽象类CoordinatorLayout$Behavior中的这7个方法与接口类NestedScrollingParent中的方法是一一对应的,只是均多了两个入参:

CoordinatorLayout coordinatorLayout, V child
3.内部类AppBarLayout$Behavior,其原型为:

/**
 * The default {@link Behavior} for {@link AppBarLayout}. Implements the necessary nested
 * scroll handling with offsetting.
 */
public static class Behavior extends HeaderBehavior<AppBarLayout>
向上寻根:

/**
 * The {@link Behavior} for a view that sits vertically above scrolling a view.
 * See {@link HeaderScrollingViewBehavior}.
 */
abstract class HeaderBehavior<V extends View> extends ViewOffsetBehavior<V>
再向上:

/**
 * Behavior will automatically sets up a {@link ViewOffsetHelper} on a {@link View}.
 */
class ViewOffsetBehavior<V extends View> extends CoordinatorLayout.Behavior<V>
由此可见,AppBarLayout$Behavior是继承自CoordinatorLayout$Behavior的一个实现类。

它覆写的主要方法有5个:


4.内部类AppBarLayout$ScrollingViewBehavior,其原型为:

public static class ScrollingViewBehavior extends HeaderScrollingViewBehavior

看其父类:

abstract class HeaderScrollingViewBehavior extends ViewOffsetBehavior<View>
看其祖父类:

class ViewOffsetBehavior<V extends View> extends CoordinatorLayout.Behavior<V> 
由此可见,AppBarLayout$ScrollingViewBehavior也是继承自CoordinatorLayout$Behavior的一个实现类。

其覆写的方法有:


5.接口类NestedScrollingChild,其方法有:


从方法名字不难看出,startNested、stopNested、NestedPreScroll、NestedScroll、NestedFling、NestedPreFling是与接口类NestedScrollingParent的方法一一对应的,不同的是这里多是dispatch开头,可以顾名思义地猜想这是联动事件的源头。

四、CoordinatorLayout的联动原理和事件流转流程如下图:


要点如下:

4.1 CoordinatorLayout作为ViewParent类,它实现了接口NestedScrollingParent的方法;

4.2 CoordinatorLayout的内部类Behavior是其他一切Behavior的基类,它里面除了NestedScroll的那组方法外,还有DependentView的一组相关方法;这两组方法作用不同;

4.3 RecyclerView作为滚动动作的源头View,限制了它必须要实现接口NestedScrollingChild的方法,同时必须指定AppBarLayout$ScrollingViewBehavior作为自己的Behavior类。

4.4 当RecyclerView作为动作的发源地时,联动动作是通过NestedScroll的那组方法传递到其兄弟节点AppBarLayout的;当AppBarLayout或者其子节点作为动作的发源地时,联动动作是通过DependentView的那组方法传递到RecyclerView的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值