Android的NestedScroll机制

Android Touch事件的传递

  1. Activity接收Touch事件回调onTouchEvent,并且将Touch事件分发给DecorView
  2. DecorView接收到Touch事件后,调用dispatchTouchEvent开始分发Touch事件
  3. ViewGroup根据onInterceptTouchEvent判断是否要中断Touch事件传递子View
    • 如果中断的话,则拦截Touch事件,则会回调onTouchEvent
    • 如果不中断的话,则会调用子View的dispatchTouchEvent继续让子View分发Touch事件
  4. 直到有子View消费掉了Touch事件,则整个过程就结束了

问题

这种事件传递的结果就会导致以下问题: 一个View把Touch事件消费之后,其他View就无法接收到该事件,也就无法根据这个事件完成与用户的交互

比如:有一个RecyclerView上有一张图和一个按钮,当ListView滑动的时候,希望这张图先往上平移直至移出屏幕,RecyclerView才能开始滑动,并且在滑动时,按钮可以随着滑动的距离进行Scale的变化

实现NestedScroll

希望支持嵌套滑动操作子View的ViewGroup的子类应该实现该接口。实现该接口的的类应该创建一个final的NestedScrollingParentHelper对象并且将所有的View或者ViewGroup的代理方法都使用它来实现。而View调用嵌套滑动的功能都需要通过ViewGroupCompat或者ViewParentCompat来兼容5.0以下以及以上的系统。

NestedScrollingParentNestedScrollingChildNestedScrollingParentHelperNestedScrollingChildHelper

以上的这些类都是用来帮助更快的实现NesedScroll。

NestScroll机制原理

NestedScroll给View与View之间提供了一种关联的机制,可以使得原来只能单独一个View消费的Touch事件变成多个View之间共同协作处理Touch事件

  • 当子View接收到Touch事件时,会通过实现了NestedScrollingParent接口的ViewParent,告知父View要开始滑动了,而父View此时可以告知实现了NestedScrollingChild接口的其他子View来共享该事件,并且将其他子View所消耗的X,Y返回给接收事件的子View,供其进行计算

步骤

  1. 子View实现NestedScrollingChild接口,并且在内部初始化一个NestedScrollingChildHelper对象,将接口中的函数均用Helper对象进行代理
  2. 父View实现NestedScrollingParent接口,并且在内部初始化一个NestedScrollingParentHelper对象,将接口中的函数均用Helper对象进行代理,同时父View也可以作为NestedScrollingChild存在
  3. 在子View的onInterceptTouchEvent以及onTouchEvent处理Event事件,并且调用dispatchNestedPreScroll以及dispatchNestedScroll方法告知父View处理滑动事件,共同处理手势坐标

NestedScrolling

参考资料

Experimenting with Nested Scrolling Android Nested Scrolling

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小黑屋

Android内存泄漏检测利器:LeakCanary

到这里你就可以检测到Activity的内容泄露了。其实现原理是设置Application的ActivityLifecycleCallbacks方法监控所有Act...

18320
来自专栏7号代码

Android网络与数据存储——File存储(实现SD卡文件浏览器)

AndroidManifest.xml中manifest标签下有一个属性android:installLocation,用于指定应用程序安装在什么地方,该属性有...

31430
来自专栏项勇

笔记13 | 练习Volley(二)加载网络图片的三种方法

14140
来自专栏james大数据架构

Android-Universal-Image-Loader 图片异步加载类库的使用

这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影。        可是有的人...

24580
来自专栏分享达人秀

ListView列表数据源——Adapter

在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter。 一、了解MVC模式 在开始学习...

439100
来自专栏编程思想之路

Android中应用调用系统权限

现在设备的安全性越来越受到重视,随之而来的便是开发中的各种不便,比如有普通权限,运行时权限,系统权限之分。对于运行时权限的添加可以参考 对于Android中各个...

31460
来自专栏QQ音乐技术团队的专栏

[Android] Toast问题深度剖析(一)

伴随着我们开发的深入,Toast 的问题也逐渐暴露出来。本文章就将解释 Toast 这些问题产生的具体原因。

2.3K150
来自专栏蜉蝣禅修之道

自定义对话框绑定控件

11220
来自专栏向治洪

Android-Universal-Image-Loader图片异步加载并缓存

 这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影。        可是有的人...

30060
来自专栏青蛙要fly的专栏

超详细的生命周期图-你能回答全吗

超详细的Activity与Fragment的生命周期图,可能大家会说你这篇文章也太水了吧。就这么一个破图。可是我觉得它写的很详细,有些方法是哪些情况下会运行,哪...

11520

扫码关注云+社区

领取腾讯云代金券