写在前面
这几天接触了CoordinatorLayout
和所谓layout_behavior
,然后进一步理了一遍源码。有两点惊艳到了我,一个是嵌套滑动机制
,再一个便是依赖管理机制
。
对于嵌套滑动NestedScroll
的分析,网上有挺多博客。那本文打算从依赖管理
的角度来讲一些东西。
效果图
这是一个模仿java继承关系
的例子,定义了一个DependencyBehavior
来描述继承关系
。
即A extends B
代表A DependsOn B
,我拖动B
时,A
也会跟着动:
源码
https://github.com/fashare2015/DependencyBehavior
分析
实现就不说了,只是定义一个DependencyBehavior
,简单的实现了两个回调:
- layoutDependsOn()
- onDependentViewChanged()
然后,用这个DependencyBehavior
,把7个TextView
串起来,即根据继承关系
建立好依赖。
建模 —— 有向无环图
那CoordinatorLayout
是怎么管理这么复杂的树形依赖呢?事实上,依赖关系可能更复杂,比如说我有一个类MapList
,既实现了Map
又实现了List
,此时用树就无法表达它。这个场景是一个有向无环图,CoordinatorLayout
里正是用这个数据结构来建模的。
图的表示
mChildDag
是一个有向无环图
,保存了边(依赖)的信息。其中 DirectedAcyclicGraph
的实现使用邻接表
实现的,邻接表
= 数组
嵌套链表
,是图的常规表示方式。本质上和HashMap
的实现差不多,从图的角度看,HashMap
也是一个有向无环图
。
public