android 触摸事件流程。

一。自己的总结。
从大的说,其实就是一个递归。
当是down信号的时候,树型结构从顶往底,每层检查触摸事件点到了哪个子group或子view,目标是逐步精确的,刚开始是确定哪个group内,再后面某个group内的某个gruop,直到最准确的view。
详细就是
1.看看当前层是否截断,不截断的话,找到触摸点对应的子view或者子groupview。如此递进。
   截断的话,不会去找触摸ivew,而直接进入当前view的dte的空参数函数。也就是调用消费流程2.22.当递进到view,本质就是一个判断是否消费的流程,返回是否消费。
3.当递进到group无法再递进时,返回默认值false。上层得到false。
4.递进之后就是递归的归了。只有2种情况,有view消费,无view消费。返回值和mFirstTouchTarget都可以知道结果。
如果无view消费。说明更精确的下层居然不处理,那么范围精度更模糊的当前层需要看看自己是否处理,执行group基类(view)的dispatchtoucheven方法,其实就是view的方法。本质就是一个判断是否消费的流程。
如果有view消费。那么之后的流程会被跳过,因为已经消费过了。

小结:当处理down完信号的时候,每个group都有自己的mFirstTouchTarget,它们不是一样的,这个mFirstTouchTarget是一个逐步逼近目标view的过程,最后一层group的mFirstTouchTarget才是,比如按钮。
当然,当截断时,只会处理到截断那层。 另外没有处理的话,每层mFirstTouchTarget都是null,直接给activity处理。

当不是down信号的时候。树型结构从顶往底,每层看自己的变量mFirstTouchTarget是否存在。(因为性能关系吧,代码没有写出截断字段,但是firsttouche为空,就表明截断为true。操蛋)
1.如果存在,说明自己的子view或者子子view处理了down。找到子view,递归本函数。一直递归到最后一层的的view或group。view就直接消费流程,group的话,传递null了。又引发了2.2
2.如果不存在,(这个函数是最操蛋的,为了性能,阅读性基本为0.)
   2.1说明没人处理,那么我处理看看,应该不会有这种情况,因为会有activity处理啊,如果真发生,那么也是无处理,因为第一层dector会处理,而且是默认的监听者都是null。所以应该是无处理。
                        2.2最常见是说明一个group在处理,最后一层的时候最后传递了null参数过来。那就执行group基类的的消费流程
                        2.3或者截断事件,因为没有去找触碰的子ivew。当然mFirstTouchTarget也是为null,不然,也不会进入这层,上层就返回了。截断就直接进入基类的消费流程。

ps.消费的流程:就是view 的dispath,其实就是 listenter+ oneventtouch.(on click)
     当前层是否截断,就是函数 onInterceptTouchEvent
     因为源代码没有可读性,代码是压缩版的,所以忘记了流程的话,先看这里的流程,再去找代码求证。
二。未完成的代码简化图。 因为代码是性能版。所以是一个fucking code!!!!!不是让人理解的版本。很弟弟的代码。
 
  
 
.简化代码大概流程。
<<android 开发艺术探索>>书和网上的流程,是一样的。刚看就觉得奇怪。自己看完代码,发现是错误的,这个也太大意了吧。

public boolean dispatchTouchEvent(MotionEvent ev) 
{
        boolean consume = false;
        if (onInterceptTouchEvent(ev)) {
                consume = onTouchEvent (ev) ;
        } 
    else 
      {
              consume = child.dispatchTouchEvent (ev) ;
          }
            return consume;
}



自己修改后认为正确的
public boolean dispatchTouchEvent(MotionEvent ev) 
{
    boolean consume = false;
    int action=ev.getAction()& MotionEvent.ACTION_MASK;
    intercepted=onInterceptTouchEvent(ev)
    if (intercepted )
    {
        consume = onTouchEvent (ev) ;
    }
    else 
    {
        if(action==down)
        {
            consume = child.dispatchTouchEvent (ev) ;
            if(consume==false)//这里不能少,递归回来需要判断是否消费了,没有消费,自己要消费掉。源码是 判断mFirstTouchTarget这个值是否为null.
            {
                consume = onTouchEvent (ev) ;
            }
        }
        else
        {
            if(child==null)//是不是到底了,如果当前view就是最下层消费的view。那就直接消费掉。否则继续递归下去。
            {
                consume = onTouchEvent (ev) ;
            }
            else
            {
                child.dispatchTouchEvent (ev) ;
            }
        }
    }
    return consume;
}

猜你喜欢

转载自www.cnblogs.com/lsfv/p/11538321.html