更多问答 >>
-
每日一问 思考一下如果捕获一个 Activity页面上所有的点击行为?
2019-05-23 00:14 -
每日一问 你有什么好的学习习惯 或者 不错的 app 推荐给大家?
2019-05-24 11:09 -
每日一问 View的onAttachedToWindow ,onDetachedFromWindow 调用时机,使用场景是什么?
2019-05-26 19:19 -
2019-05-29 12:23
-
每日一问 gradle Transform API 和 Annotation Processor各有什么使用场景?能否相互替换与补充。
2019-06-13 21:54 -
每日一问 | 并发专题 volatile,synchronize,cas,happens before, lost wake up
2019-05-19 20:37 -
讨论 | Flutter Kotlin 如果二选一学习,你会怎么选?
2019-05-16 09:04 -
2019-05-17 00:38
-
2019-05-13 08:30
-
2019-04-11 18:34

事件分发原理:
事件分发,其实就是一个责任链的变种,这个责任链,是一个设计模式。
在Android中,当最顶层的View收到事件之后,会一级一级地往下传,在每一级View中,它们各自都有权利去处理(也就是拦截)这个事件,如果这次的事件传到了最底层的View,也没能处理的话,就会从这个最底层的View一级一级地向上传回去。嵌套滚动:
这个嵌套滚动,说的应该不是普通的嵌套滚动(比如ScrollView套ListView),而是说NestedScrollingParent和NestedScrollingChild,这两个东西,出来挺久了,可能好多同学还是觉得有点陌生,但我们在很多场景下,已经在不识不觉中使用它了,比如说CoordinatorLayout,它是一个NestedScrollingParent,还有RecycleView,它是一个NestedScrollingChild。
一个最常见的效果:列表向上滚动,ToolBar收起,反之,当列表向下滚动时,ToolBar随着列表的滚动出现。这个效果,用NestedScrolling来实现,可以非常简单。嵌套滚动原理:
至于它的原理,很简单:在NestedScrollingChild滚动过程中,它和NestedScrollingParent会一直"保持通讯",比如:
当然了,除了手指触摸滚动的,还有惯性滚动,但原理和流程是一样的。至于为什么嵌套滚动有必要存在,我觉得有以下几个原因:
赞~\(≧▽≦)/~
厉害了
赞~\(≧▽≦)/~
简洁明了,通俗易懂👍
思考下为什么嵌套滚动有必要存在
假设我们按照传统的事件分发去理解,首先我们滑动的是下面的内容区域,而移动却是外部的ViewGroup在移动,所以按照传统的方式,肯定是外部的Parent拦截了内部的Child的事件;
但是,上述效果图,当Parent滑动到一定程度时,Child又开始滑动了,中间整个过程是没有间断的。
从正常的事件分发(不手动调用分发事件,不手动去发出事件)角度去做是不可能的,因为当Parent拦截之后,是没有办法再把事件交给Child的,事件分发,对于拦截,相当于一锤子买卖,只要拦截了,当前手势接下来的事件都会交给Parent(拦截者)来处理。
这个时候我们要强制通过事件分发来实现,那么就要破坏原有的分发规则,这个会存在潜在的风险,因为破坏规则的控件总会成为别的子控件或者父控件,别的控件总是认为你是遵循事件分发角度来设计的。
但是,嵌套滚动来实现就很简单。
学到了,感谢鸿神分享~ 图片好像看不了。。。
修正了下图片链接,晚上回去把内容排版调一下,换行好像被我干掉了
赞~\(≧▽≦)/~ 向大神们膜拜学习
So, 大神,有没有强制通过事件分发来实现上图效果的demo或文章推荐?主要想深入的理解下事件分发机制。
1. 事件分发的原理:
点击/触摸都会有事件产生,事件需要得到响应处理,给谁处理需要分发,分发要有规则,所以有分发机制。
2. 嵌套滚动的原理
嵌套是在两个控件中且都可以滚动,分父子控件,当事件传递过来就需要有具体的表现,事件控制权在父控件,当父控件决定消费这次事件,子控件就收不到事件,当然子控件可以提出申请。
3. 思考下为什么嵌套滚动有必要存在;
用户场景,上下滑的控件中非要插入左右滑动
开发成本,有些时候这样使用实现起来方便
历史遗留,接手前人的项目,代码就是这么写的,可稳定使用
3、页面大小有限,嵌套滚动可以容纳下更过的数据。在更小的页面上可以进行更多的操作。
你这个用户名...
事件分发的原理: activity 到viewgroup,view的用户点击滑动事件的透传和拦截机制
1.事件分发的原理:事件分发就是顶层 ViewGroup 不断向子View和ViewGroup传递事件监听的过程,到达每一个ViewGroup都会先进入 dispatchTouchEvent 方法通过 onintercepttouchevent() 的返回值判断是否拦截还是向下进行分发,如果拦截就直接走 onTouchEvent(),然后 onTouchEvent() 中如果返回 true 就表示消耗了此次事件,如果返回 false 就向上层传递事件。
2.嵌套滚动的原理:同方向嵌套滚动需要根据点击区域进行拦截,上下反方向的嵌套滚动需要判断手势滑动方向进行事件拦截3.思考下为什么嵌套滚动有必要存在:业务需要我也说几句,加强自己的思路。如有不对,请指教
1 事件会先落到最顶层的view,如果当前的view没有处理,那么下渗到下一层,如果被拦截,那么不会接着下渗,然后重复这个逻辑,直到最后一层。2 嵌套滚动我认为有两种, 一种是子view和父view独立滚动,一方唱罢一方登台,一种是子view滚动和父view滚动并行来,子view滚动的时候父view也可以同时滚动。3 嵌套滚动是有需求的,很多漂亮的滚动页面,滚动的接力都需要嵌套。事件分发原理:
责任链模式,处理顺序 Activity->DecorView->ViewGroup->View