基于https://www.wanandroid.com每日一问的笔记,做一些整理,方便自己进行查看和记忆。
事件分发原理
- 事件分发,其实就是一个责任链的变种,这个责任链,是一个设计模式。
- 在Android中,当最顶层的View收到事件之后,会一级一级地往下传,在每一级View中,它们各自都有权利去处理(也就是拦截)这个事件,如果这次的事件传到了最底层的View,也没能处理的话,就会从这个最底层的View一级一级地向上传回去。
嵌套滚动
- 这个嵌套滚动,说的应该不是普通的嵌套滚动(比如ScrollView套ListView),而是说NestedScrollingParent和NestedScrollingChild,这两个东西,出来挺久了,可能好多同学还是觉得有点陌生,但我们在很多场景下,已经在不识不觉中使用它了,比如说CoordinatorLayout,它是一个NestedScrollingParent,还有RecycleView,它是一个NestedScrollingChild。
一个最常见的效果:列表向上滚动,ToolBar收起,反之,当列表向下滚动时,ToolBar随着列表的滚动出现。这个效果,用NestedScrolling来实现,可以非常简单。
嵌套滚动原理
- 它的原理,很简单:在NestedScrollingChild滚动过程中,它和NestedScrollingParent会一直"保持通讯",比如:
- 当Child滚动之前,会通知Parent:“我要开始滚动啦,你看你要不要做点什么”。
- 当Child在滚动的时候,也会每次通知Parent:“我这次消费了xxx,你看你还要做什么”。
- 当Child滚动完成,Parent也会收到通知:“我滚动完成了”。
- 除了手指触摸滚动的,还有惯性滚动,但原理和流程是一样的。
至于为什么嵌套滚动有必要存在,我觉得有以下几个原因:
- 减少工作量,比如说一些看似很复杂滚动效果,在使用NestedScrolling机制之后,就变得简单起来了。
- 降低耦合度,在NestedScrolling机制出现之前,很多与子View有滚动交互的ViewGroup,大部分处理滚动的代码,都堆积这个ViewGroup中。而推出了NestedScrolling之后,这个滚动的子View,由被动方,变成了主动方(滚动的状态都是由这个子View去决定,不再需要ViewGroup去主动判断)。
- 增加灵活性,CoordinatorLayout的强大,相信同学们都体会到了,它可以通过设置各种不同的Behavior,来定制它的交互效果。