安卓-事件分发、拦截源码分析 viewpager2冲突

389 阅读3分钟

前言:

看了几天终于把5.0之前版本的事件分发源码结合博客大体思路梳理的差不多了.细则就没看了,太多了!,博客结合源码建议多看几遍!!刚开始我看的时候也是懵逼状态,看了几遍好多了.至于新版的事件分发源码更难,看的头大还是一头雾水.本来想看完自己写分析的,奈何下面引用的博客大佬写的实在是太香了,就没有必要自己写了,毕竟写博客的目的是吸收!而不是东施效颦,这样也是耽误读者.

目的

既然有事件分发,那就肯定是处理一种实际场景,不然哪怕写的再牛逼!没有实际场景,意义就大打折扣.,所以实际场景,就是我们开发中存在各种各样的事件滑动冲突,如果不处理,体验极差!

1.有哪些事件滑动冲突场景?以及怎么解决滑动冲突呢?

内部拦截法、外部拦截法。
参考1:常见的滑动冲突场景及解决方案
参考2:一文解决Android View滑动冲突
这2篇文章,其实以及处理了事件冲突了,基本上算是最后的精华了.如果只是要求处理冲突这2篇文章就够了.但是如果不了解事件分发的机制,我们是不清楚这样做为什么能处理滑动冲突,对于事件的整个机制也是一脸懵逼,所以核心大头是事件分发机制的分析

2.事件分发机制

事件分发源码看的巨痛苦,尤其是新版,里面细节特别多. 本来想把里面提炼出来,比如
1. 事件分发本质:是将点击事件(MotionEvent)传递到某个具体的view&处理的整个过程.
2. 事件分发涉及到的核心方法:dispatchTouchEvent()(最早被调用到) 、onInterceptTouchEvent()(只存在viewGroup)和onTouchEvent()(当前view是否处理事件,返回true是自己处理,否则向父类传递),还有延伸ontouch跟onclick
3. 事件在哪些对象间传递呢? Activity(它不是view,更多是view的管理器)、ViewGroup、View
事件传递的顺序:Activity -> ViewGroup -> View
4. 事件分发过程由哪些方法协作完成?dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()
5. 为啥当action_down返回false 后续的move、up不会执行呢等等


不过思虑再三还是建议看下面这2篇文章,作者真的是太牛逼了(里面我感觉存在有些细小的问题,这个我觉得不妨碍)
老版本参考: Android事件分发机制 详解攻略,您值得拥有
新版本参考(更难): [深入浅出Android事件分发机制:最全面最易懂:高级篇(三)] (www.jianshu.com/p/e57372c0b…)

补充:为啥viewpager不会出现滑动冲突?源码里面是怎么处理的?

ViewPager源码分析(2):滑动及冲突处理,核心点其实就是基于水平/垂直移动距离、以及移动角度去判断给谁处理的

【Android 实验室】ViewPager2 横向滑动冲突的研究 讲解的非常精华 最好后期还是找个实例演示一遍为好

ViewPager2滑动冲突最全面的处理方案