登录

去注册

登录

注册

去登录

注册

每日一问 对于事件分发,嵌套滚动的了解

xiaoyang   2019-05-21   收藏

你可以随便回答以下任意个问题:

1. 事件分发的原理;

2. 嵌套滚动的原理;

3. 思考下为什么嵌套滚动有必要存在;

13

事件分发原理:

事件分发,其实就是一个责任链的变种,这个责任链,是一个设计模式。
在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也会收到通知:"我滚动完成了"。


当然了,除了手指触摸滚动的,还有惯性滚动,但原理和流程是一样的。

至于为什么嵌套滚动有必要存在,我觉得有以下几个原因:

  1. 减少工作量,比如说一些看似很复杂滚动效果,在使用NestedScrolling机制之后,就变得简单起来了。
  2. 降低耦合度,在NestedScrolling机制出现之前,很多与子View有滚动交互的ViewGroup,大部分处理滚动的代码,都堆积这个ViewGroup中。而推出了NestedScrolling之后,这个滚动的子View,由被动方,变成了主动方(滚动的状态都是由这个子View去决定,不再需要ViewGroup去主动判断)。
  3. 增加灵活性,CoordinatorLayout的强大,相信同学们都体会到了,它可以通过设置各种不同的Behavior,来定制它的交互效果。

多谢大家~[污][污]
回复
m_博客俊逸 : @陈小缘 

赞~\(≧▽≦)/~

2019-06-25 回复
jack601 : @陈小缘 

厉害了

2019-06-21 回复
996458860 : @陈小缘 

赞~\(≧▽≦)/~

2019-05-21 回复
3

思考下为什么嵌套滚动有必要存在



假设我们按照传统的事件分发去理解,首先我们滑动的是下面的内容区域,而移动却是外部的ViewGroup在移动,所以按照传统的方式,肯定是外部的Parent拦截了内部的Child的事件;


但是,上述效果图,当Parent滑动到一定程度时,Child又开始滑动了,中间整个过程是没有间断的。


从正常的事件分发(不手动调用分发事件,不手动去发出事件)角度去做是不可能的,因为当Parent拦截之后,是没有办法再把事件交给Child的,事件分发,对于拦截,相当于一锤子买卖,只要拦截了,当前手势接下来的事件都会交给Parent(拦截者)来处理。


这个时候我们要强制通过事件分发来实现,那么就要破坏原有的分发规则,这个会存在潜在的风险,因为破坏规则的控件总会成为别的子控件或者父控件,别的控件总是认为你是遵循事件分发角度来设计的。


但是,嵌套滚动来实现就很简单。

回复
m_博客俊逸 : @鸿洋 

赞~\(≧▽≦)/~ 向大神们膜拜学习

2019-06-25 回复
鸿洋 : @陈小缘 

修正了下图片链接,晚上回去把内容排版调一下,换行好像被我干掉了

2019-05-20 回复
陈小缘 : @鸿洋 

学到了,感谢鸿神分享~ 图片好像看不了。。。

2019-05-20 回复
1

1. 事件分发的原理:

    点击/触摸都会有事件产生,事件需要得到响应处理,给谁处理需要分发,分发要有规则,所以有分发机制。


2. 嵌套滚动的原理

    嵌套是在两个控件中且都可以滚动,分父子控件,当事件传递过来就需要有具体的表现,事件控制权在父控件,当父控件决定消费这次事件,子控件就收不到事件,当然子控件可以提出申请。


3. 思考下为什么嵌套滚动有必要存在;

    用户场景,上下滑的控件中非要插入左右滑动

    开发成本,有些时候这样使用实现起来方便

    历史遗留,接手前人的项目,代码就是这么写的,可稳定使用    

回复
1

3、页面大小有限,嵌套滚动可以容纳下更过的数据。在更小的页面上可以进行更多的操作。

回复
鸿洋 : @www.wanandroid.com 

你这个用户名...

2019-05-20 回复
0

事件分发原理:

责任链模式,处理顺序 Activity->DecorView->ViewGroup->View



回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定