美文网首页
touch传递机制

touch传递机制

作者: 404b244d4452 | 来源:发表于2018-07-16 23:22 被阅读0次

    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事件。

    相关文章

      网友评论

          本文标题:touch传递机制

          本文链接:https://www.haomeiwen.com/subject/ymmipftx.html