Android常规的Touch事件传递机制是自顶向下,由外向内的,一旦确定了事件消费者View,随后的事件都将传递到该View。因为是自顶向下,父控件可以随时拦截事件,下拉刷新、拖拽排序、折叠等交互效果都可以通过这套机制完成。Touch事件传递机制是Android开发必须掌握的基本内容。但是这套机制存在一个缺陷:子View无法通知父View处理事件。NestedScrolling就是为这个场景设计的。 NestedScrollingChild和NestedScrollingParentNestedScrolling是指存在嵌套滚动的场景,常见于下拉刷新、展开/收起标题栏等。Support包中的
通过方法名可以看出, NestedScrolling机制生效的前提条件是子View作为Touch事件的消费者,在消费过程中向父View发送NestedScrolling事件(注意这里不是Touch事件,而是NestedScrolling事件)。 NestedScrolling事件传递NestedScrolling机制中,NestedScrolling事件使用 NestedScrolling事件的传递:
方法调用流程我们可以把上面的方法根据NestedScrolling事件传递的不同阶段进行分组(Fling跟随Scrolling发生)。 初始阶段:确认开启NestedScrolling,关联父View和子View。
预滚动阶段:子View将事件分发到父View
滚动阶段:子View处理滚动事件。 结束阶段:结束。 下面是一次嵌套滚动(**嵌套)从开始到结束的方法调用时序图:
当子View调用 划重点最重要的一点:pre-scroll过程是子View向父View传递事件的过程,而scroll过程才是子View消耗滚动事件的过程,也就是说父View拥有优先消费事件的权利。 从事件消耗的优先级来看,可以画出这样一张图。 dispatchNestedPreScroll传给父View的是没有被消费的滚动事件,父View消费完之后通过consumed数组返回,如果还有剩余,子View进行消费,并将消费多少和剩余多少再次发给父View。 如果一个View同时作为NestedScrollingChild和NestedScrollingParent,那么在处理onNestedPreScrolling和onNestedScrolling的时候,也要按照自底向上的规则,先让父View处理事件。 声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除 |