首页 > 其他 > 详细

View的事件分发机制

时间:2016-03-28 13:26:56      阅读:204      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!