1、viewrootimpl中的windowinputeventreceiver接受事件
2、ViewrootImpl将事件被传递到decorview
3、decorview将事件传递给activity
4、activity将事件传递给phonewindow再传递给decorview
5、decorview即viewgroup。
6、viewgroup判断是否自己拦截,进行递归判断最终需要执行事件的view
7、如果viewgroup处理事件,则不执行activity的ontouchevent,如果为false,则执行activity的ontouchevent
8、如果activity的ontouevent执行了且为false,则返回至decorview
9、执行phonewindow的onkeydown和onkeyup
viewrootimpl--receiver--decorview--
activity--phonewindwo---decorview---viewgroup/view=true?null:activity.outouchevent
参考:
ViewRootImpl中的WindowInputEventReceiver接受时间,排列分发。
ViewRootImpl中的InputStage对事件进行顺序处理。
通过ViewPostImeInputStage将事件传递到DecorView中。
DecorView进行判断当前状态,将事件传递给Activity或ViewGroup。
Activity将事件传递给Window再传递给DecorView,然后传递到View层。
ViewGroup先判断是否消耗,消耗则事件终止,不消耗则传递给包括的子View。
View先判断是否有监听器,优先触发监听,没有则触发View实现KeyEvent.Callback方法。
如果View监听器和回调都返回false,事件往回传递至Activity。
执行Activity实现KeyEvent.Callback的相关方法。
如果Activity中仍返回false,不消耗,则继续往回返,传递至DecorView。
执行PhoneWindow的onKeyDown和onKeyUp。
作者:H029982384
链接:https://www.jianshu.com/p/76b3e1913f51
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
https://blog.csdn.net/qq1282675628/article/details/78567508
===================================================
https://www.cnblogs.com/linjzong/p/4191891.html
1.Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。
2.ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。
3.触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。
4.当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。
子view的dispatchtouchevent中,优先调用listener.outouch,如果为true则返回true,down和move继续给它使用。如果为false,则返回onTouchEvent.
5.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。当Move和UP事件来时,会先从ViewGroup0传递至ViewGroup1,再由ViewGroup1传递至TextView。
6.当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouchEvent事件:触发的方式是调用super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触发Acitivity的onTouchEvent方法。
7.onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。