您的位置:首页 > 其它

Material Design风格中CoordinatorLayout、Behavior和nestedScroll的整理分析

2016-07-15 02:12 344 查看
现象与分解

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概念很不错的一篇
https://lab.getbase.com/introduction-to-coordinator-layout-on-android/ 其源码 https://github.com/ggajews/coordinatorlayoutwithfabdemo
中文翻译版本 http://www.jianshu.com/p/0e20aadf8415

其中父与多个子view之间互动过程
子view之一是SnakeBar
子view之二是FloatActionButton,声明自己有Behavior,以及敏感对象是SnakeBar
父ViewGroup是一个CoordinatorLayout,实现了NestedScrollingParent接口
SnakeBar发生变化。似乎没有主动知会ViewGroup,可能是父ViewGroup在分配布局时知道
父ViewGroup轮询所有子view,查看是否有对SnakeBar敏感的Behavior并传递信息过去
FloatActionButton因此滑动
Snackerbar滑动

关于Coordinator和NestedScroll互动的很不错的一篇
https://lab.getbase.com/nested-scrolling-with-coordinatorlayout-on-android/
其源码 https://github.com/ggajews/nestedscrollingchildviewdemo
中文翻译版本 http://www.jianshu.com/p/81e19b2e5705

互动过程
主动子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接口,留意交互流程,以及滑动距离的分配与消费
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: