一个能让普通 View 轻松实现嵌套滚动的控件

摘要

在Android的事件分发机制当中,在同一个事件流中,如果由父控件拦截/消费了,那么子控件就没办法再获取到该事件流。这种传统的事件分发机制在嵌套滚动时会有明显不足,就是子控件无法消费父控件没有消费掉的滑动距离(因为起初是父控件接收了滑动事件,那么在同一个事件流中,所有事件都会给到父控件,子控件接收不到事件,也就无法滑动),从而造成嵌套滚动的不连贯(如果想滑动子控件就只能抬起手指结束本次事件流,并在下一次事件中滑动子控件)。使用嵌套滚动机制可以有效的解决上面的问题。它并没有改变事件分发机制,在发生嵌套滚动时,还是先进行事件分发,由父View将事件分发给子View,由子View进行消费。只不过,子View在自己消费之前,会先去询问父View,是否需要处理滑动事件,如果父View需要处理,就先交由父View进行滑动,父View滑完了,子 View 才进行滑动。在嵌套滑动中有两个角色:Child 和 Parent,Child 需要实现 NestedScrollingChild/NestedScrollingChild2/NestedScrollingChild3 接口之一,比如系统控件RecyclerView,而 Parent 需要实现 NestedScrollingParent/NestedScrollingParent2/NestedScrollingParent3 接口之一,比如系统控件CoordinatorLayout。在Android系统中要实现嵌套滚动,子View需实现NestedScrollingChild接口才能和实现了NestedScrollingParent接口的父View进行嵌套滚动。但是,在复杂的业务场景中,子View可能只是普通View(或ViewGroup),其本身并没有实现NestedScrollingChild接口,普通的子View可能是各种各样的控件,而且不止一个。

欢迎在评论区写下你对这篇文章的看法。

评论

ホーム - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-14 15:32
浙ICP备14020137号-1 $お客様$