Android的NestedScroll机制
时间:2022-06-13
本文章向大家介绍Android的NestedScroll机制,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Android Touch事件的传递
- Activity接收Touch事件回调
onTouchEvent
,并且将Touch事件分发给DecorView - DecorView接收到Touch事件后,调用
dispatchTouchEvent
开始分发Touch事件 - ViewGroup根据
onInterceptTouchEvent
判断是否要中断Touch事件传递子View- 如果中断的话,则拦截Touch事件,则会回调
onTouchEvent
- 如果不中断的话,则会调用子View的
dispatchTouchEvent
继续让子View分发Touch事件
- 如果中断的话,则拦截Touch事件,则会回调
- 直到有子View消费掉了Touch事件,则整个过程就结束了
问题
这种事件传递的结果就会导致以下问题: 一个View把Touch事件消费之后,其他View就无法接收到该事件,也就无法根据这个事件完成与用户的交互
比如:有一个RecyclerView上有一张图和一个按钮,当ListView滑动的时候,希望这张图先往上平移直至移出屏幕,RecyclerView才能开始滑动,并且在滑动时,按钮可以随着滑动的距离进行Scale的变化
实现NestedScroll
希望支持嵌套滑动操作子View的ViewGroup的子类应该实现该接口。实现该接口的的类应该创建一个final的NestedScrollingParentHelper
对象并且将所有的View或者ViewGroup的代理方法都使用它来实现。而View调用嵌套滑动的功能都需要通过ViewGroupCompat
或者ViewParentCompat
来兼容5.0以下以及以上的系统。
NestedScrollingParent
、NestedScrollingChild
、NestedScrollingParentHelper
、NestedScrollingChildHelper
以上的这些类都是用来帮助更快的实现NesedScroll。
NestScroll机制原理
NestedScroll给View与View之间提供了一种关联的机制,可以使得原来只能单独一个View消费的Touch事件变成多个View之间共同协作处理Touch事件
- 当子View接收到Touch事件时,会通过实现了
NestedScrollingParent
接口的ViewParent,告知父View要开始滑动了,而父View此时可以告知实现了NestedScrollingChild
接口的其他子View来共享该事件,并且将其他子View所消耗的X,Y返回给接收事件的子View,供其进行计算
步骤
- 子View实现
NestedScrollingChild
接口,并且在内部初始化一个NestedScrollingChildHelper
对象,将接口中的函数均用Helper对象进行代理 - 父View实现
NestedScrollingParent
接口,并且在内部初始化一个NestedScrollingParentHelper
对象,将接口中的函数均用Helper对象进行代理,同时父View也可以作为NestedScrollingChild存在 - 在子View的
onInterceptTouchEvent
以及onTouchEvent
处理Event事件,并且调用dispatchNestedPreScroll
以及dispatchNestedScroll
方法告知父View处理滑动事件,共同处理手势坐标
NestedScrolling
参考资料
Experimenting with Nested Scrolling Android Nested Scrolling
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Flutter组件随笔练习
- TKE 容器健康检查最佳实践
- 微信小程序修改checkbox和radio的样式
- TRTC Android端开发接入学习之实现实时屏幕分享(四)
- Vue使用组件递归实现评论盖楼功能笔记
- 自监督注意力在密集光流估计中的应用
- SpringBoot+MyBatis+Spring 技术整合实现商品模块的CRUD操作
- 什么?面试官让我用ArrayList实现一个阻塞队列?
- A little fun with InnoDB multi-versioning(14.有关InnoDB多版本中的一个小问题)
- 聊聊java中的哪些Map:(八)ConcurrentSkipListMap源码分析
- littlevgl(Lvgl)最新版V7.4移植
- TiKV 源码解析系列文章(二十)Region Split 源码解析
- 轻松构建Tomcat源码
- Flutter中Contrainer 组件的宽高限制分析
- 10张图带你深入理解Docker容器和镜像