[关闭]
@xujun94 2016-06-28T09:57:54.000000Z 字数 1717 阅读 1615

View和ViewGroup的事件分发机制

View的事件分发机制


本文固定连接:https://www.zybuluo.com/xujun94/note/420803
可以参考这篇文章:http://www.jianshu.com/p/e99b5e8bd67b

一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

常见问题

当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?

  1. 默认的情况下会交给View的onToucheEvent事件处理,为什么呢?因为ViewGroup和View的dispatchEvent的默认实现都是调用super的方法,而ViewGroup的super方法又会调用自身的onInterceptTouchEvent方法,OnInterceptTouchevent方法又会默认调用返回false,这样时间就传递到View了,View的onDispatchEvent方法又会调用super方法,在super方法里面默认是会调用自己的onTouchEvent方法,所以当我们点击一个ViewGroup里面的View是,会先触发View的onTouchEvent事件,至于会不会调用父View即ViewGroup的onTouchEvent事件,得看我们是不是返回false,返回false,会调用父View即ViewGroup的onTouchEvent事件,反之则不会。

详细的情况请见下图

  到底是

  android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
  1)public boolean dispatchTouchEvent(MotionEvent ev)  这个方法用来分发TouchEvent

  2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
  3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
  当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,
  TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由  dispatchTouchEvent 方法进行分发,

  如果dispatchTouchEvent返回true 消费事件,事件终结。
  如果dispatchTouchEvent返回 false ,则回传给父View的oNTouchEvent事件处理;
    > onTouchEvent事件返回true,事件终结,返回false,交给父View的OnTouchEvent方法处理
  如果dispatchTouchEvent返回super的话,默认会调用自己的onInterceptTouchEvent方法
    > 默认的情况下interceptTouchEvent回调用super方法,super方法默认返回false,所以会交给子View的onDispatchTouchEvent方法处理
  如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,
  如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。
  注意View和ViewGroup的diapatchTouchEvent默认super的实现方式,
  View的默认实现是调用自身的onTouchEvent,ViewGroup的默认实现是调用自身的onInterceptTouchEvent方法

小结

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注