View的事件分发机制

来源:互联网 发布:音序器软件中文版 编辑:程序博客网 时间:2024/05/17 08:43

废话不多说,直接上代码

我的布局为 viewgroup包含viewgroup里面嵌套view,布局层级关系如图:


每个view都重写了DispatchtouchEvent、OnInterceptTouchEvent、OnTouchEvent方法。其中,非ViewGroup的view没有OnInterceptTouchEvent方法

现在我们点击最外层的view,


事件的响应顺序如下:最外层的viewgroup 的dispatchtouchevent先响应,触发action down事件,然后onintercepttouchevent的action down触发,然后ontouchevent的action down触发,因为每一层都没拦截,最后会调用最外层的viewgroup的dispatchtouchevent的  action up,然后是ontouchevent的action up方法,最后最外层的viewgroup的onclick事件响应

2、当点击内层的viewgroup的时候,响应顺序如下:

E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN

E/zp: MyLinearLayout  onTouchEvent ACTION_DOWN
E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
E/zp: MyLinearLayout  onTouchEvent ACTION_UP
E/zp: llInner onclick

事件的响应顺序为:可以看出,由外而内,先判断action down,然后判断action up,最后消费

3、当点击内层的view的时候,响应顺序:

E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DO
E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
E/zp: MyTextView  onTouchEvent ACTION_DOWN
E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP
E/zp: MyTextView  dispatchTouchEvent ACTION_UP
E/zp: MyTextView  onTouchEvent ACTION_UP
E/zp: tv onclick

事件的响应顺序为:可以看出,由外而内,先判断action down,然后判断action up,最后由最内层的view消费


二、当最内层的textview的dispatchtouchevent 方法 action down返回true时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyTextView  dispatchTouchEvent ACTION_UP
 E/zp: MyTextView  onTouchEvent ACTION_UP

该view消费了事件,onclick点击无响应,被拦截

2、当最内层的textiview的dispatchtouchevent 方法 action up返回true时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
 E/zp: MyTextView  onTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyTextView  dispatchTouchEvent ACTION_UP
该view消费了事件,onclick点击无响应,被拦截。同时onTouchEvent ACTION_UP 也被拦截

3、当最内层的texiview的onTouchEvent的ACTION_DOWN返回true的时候,

E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
E/zp: MyTextView  onTouchEvent ACTION_DOWN
E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP
E/zp: MyTextView  dispatchTouchEvent ACTION_UP
E/zp: MyTextView  onTouchEvent ACTION_UP

4、当最内层的texiview的onTouchEvent的ACTION_up返回true的时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
 E/zp: MyTextView  onTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyTextView  dispatchTouchEvent ACTION_UP
 E/zp: MyTextView  onTouchEvent ACTION_UP

5、当内层的viewgroup的dispatchtouchevent的action down返回true的时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onTouchEvent ACTION_UP

6、当内层的viewgroup的dispatchtouchevent的action up返回true的时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
 E/zp: MyTextView  onTouchEvent ACTION_DOWN

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP

7、当内层的viewgroup的interceptouchEvent的action down返回true的时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onTouchEvent ACTION_UP
 E/zp: llInner onclick(内层的viewgroup的点击事件响应了)

8、当内层的viewgroup的interceptouchEvent的action up返回true的时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
 E/zp: MyTextView  onTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP

9、当内层的viewgroup的onTouchEvent的action DOWN 返回true的时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
 E/zp: MyTextView  onTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyTextView  dispatchTouchEvent ACTION_UP
 E/zp: MyTextView  onTouchEvent ACTION_UP
 E/zp: tv onclick  (最内层的view的点击事件响应了)

10、当内层的viewgroup的onTouchEvent的action up返回true的时候,

 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_DOWN
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_DOWN
 E/zp: MyTextView  dispatchTouchEvent ACTION_DOWN
 E/zp: MyTextView  onTouchEvent ACTION_DOWN
 E/zp: MyLinearLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyLinearLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  dispatchTouchEvent ACTION_UP
 E/zp: MyRelativeLayout  onInterceptTouchEvent ACTION_UP
 E/zp: MyTextView  dispatchTouchEvent ACTION_UP
 E/zp: MyTextView  onTouchEvent ACTION_UP
 E/zp: tv onclick (最内层的view的点击事件响应了)


四、从上述事件的点击事件可以看出,view的分发流程如下:









































原创粉丝点击