码迷,mamicode.com
首页 > 其他好文 > 详细

View的事件分发机制

时间:2016-03-28 13:27:47      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

  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的事件分发机制

标签:

原文地址:http://www.cnblogs.com/mmcc/p/5328468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!