View的事件分发机制

Posted 云潇潇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了View的事件分发机制相关的知识,希望对你有一定的参考价值。

  public boolean dispatchTouchEvent(MotionEvent ev)  用来进行事件的分发

  public boolean onInterceptTouchEvent(MotionEvent ev) 在onInterceptTouchEvent中调用,用来判断是否拦截某个事件

  public boolean onTouchEvent(MotionEvent ev) 在onInterceptTouchEvent中调用,用来处理三者的关系

  那么三个方法到底有什么区别呢?三者的关系是什么?它们的关系可以用如下代码表示:

  public boolean dispatchTouchEvent(MotionEvent ev){

    boolean consume = false;

    if(onInterceptTouchEvent(ev)){

      consume = onTouchEvent(ev);

    }else{

      consume = child.dispatchTouchEvent(ev);

    }

    return consume;

  }

  通过上面的代码可以了解到点击事件的传递规则:对于一个要ViewGroup来说,点击事件产生后,首先会传递给他,他的dispatchTouchEvent就会被调用,如果它的onInterceptTouchEvent返回true就表示它要拦截当前事件,接着就会调用它的onTouchEvent,如果返回false就表示它不拦截当前事件,就会传给它的子元素,调用子元素的dispatchTouchEvent,如此反复直到事件被最终处理。

  当一个View需要处理事件时,如果设置了OnTouchListener,那么OnTouchListener中的onTouch会被调用,如果返回true,onTouchEvent不再调用,如果返回false才会继续传给onTouchEvent,如果当前设置的有OnClickListener,那么在onTouchEvent中会调用它的onClick方法。由此可见,优先级OnTouchListener > onTouchEvent > onClickListener。

  分发是一级一级往下,处理是一级一级往上,当分发到最下级,最下级的onTouchEvent不处理时,会传给上一级处理。

以上是关于View的事件分发机制的主要内容,如果未能解决你的问题,请参考以下文章

Android 源码解析View的touch事件分发机制

View事件分发机制

View的事件分发机制

Android中View的事件分发机制

Android View体系从源码解析View的事件分发机制

Android事件分发机制总结