现象与分解
Material Design中一个神奇的设计是,抹动一个子view甲时,子view乙与子view甲一起滑动
可以想象一下,其实现过程必然是
子view甲向父ViewGroup申请滑动
父ViewGroup将部分滑动距离交给子view甲,部分交给子view乙
子view甲和乙同时滑动
为完成这个组合滑动过程,View及ViewGroup类增加了三个概念
有Coordinator功能的ViewGroup可以分配滑动给子view
NestedScroll的概念,中文直译是“嵌套滑动” ,但感觉“关联滑动”更为贴切
子view的行为,Behavior
这类组合滑动可以抽象为如下更为一般性的关联行为
子view希望某个动作,向父ViewGroup申请
父ViewGroup协调其他子view同步进行动作
官网上对此关联行为并无系统性的说明
搜索与研究
关于Coordinator和Behavior概念很不错的一篇
其中父与多个子view之间互动过程
子view之一是SnakeBar
子view之二是FloatActionButton,声明自己有Behavior,以及敏感对象是SnakeBar
父ViewGroup是一个CoordinatorLayout,实现了NestedScrollingParent接口
SnakeBar发生变化。似乎没有主动知会ViewGroup,可能是父ViewGroup在分配布局时知道
父ViewGroup轮询所有子view,查看是否有对SnakeBar敏感的Behavior并传递信息过去
FloatActionButton因此滑动
Snackerbar滑动
关于Coordinator和NestedScroll互动的很不错的一篇
互动过程
主动子view实现NestedScrollingChild接口,用来和父ViewGroup沟通
父ViewGroup实现NestedScrollingParent接口,用来和主动子view沟通
被动子view实现Behavior,其中也有nested scroll相关处理方法
主动子view在NestedScrollingChild接口中通过辅助对象NestedScrollingChildHelper通知父ViewGroup
父ViewGroup遍历子view,如果有子view有对应Behavior,调用该Behavior
可见,主动子view和父ViewGroup之间是NestedScrollingChild及NestedScrollingParent接口,父ViewGroup和被动子view之间是Behavior
值得阅读的源码
CoordinatorLayout,作为父ViewGroup
AppBarLayout,作为被动子view
NestedScrollView,既有父接口也有子接口
FloatingActionButton,有Behavior
NestedScrollingChild及NestedScrollingParent接口,留意交互流程,以及滑动距离的分配与消费