<commit_before>---
layout: post
author: mxn
titile: android事件传递分析
category: 技术博文
tag: android
---

android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法：

1）public boolean dispatchTouchEvent(MotionEvent ev)          这个方法用来分发TouchEvent

2）public boolean onInterceptTouchEvent(MotionEvent ev)         这个方法用来拦截TouchEvent

3）public boolean onTouchEvent(MotionEvent ev)                 这个方法用来处理TouchEvent

注意：不是所有的View的子类，只有可以向里面添加View的控件才需要分发，比如TextView它本身就是最小的view了，所以不用再向它的子视图分发了，它也没有子视图了，所以它没有dispatch和Intercept，只有touchEvent。而 Activity 对 onInterceptTouchEvent(MotionEvent ev) 也就是事件拦截不进行响应。


##三个方法的用法
####dispatchTouchEvent():用来分派事件。
其中调用了onInterceptTouchEvent()和onTouchEvent()，一般不重写该方法。
Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式（从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递）将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法，并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑如下：

如果 return true，事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费，同时事件会停止向下传递；
如果 return false，会将事件返回给父 View 的  onTouchEvent 进行消费。
如果返回系统默认的 super.dispatchTouchEvent(ev)，事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。

注意：dispatchTouchEvent()的三种返回值效果各不相同。可简单理解为：
返回true,不传给别人，自己消费，事件消失；
返回false,向上传递，即反方向返回传递，向父类onTouchEvent传递
返回super.dispatchTouchEvent(ev),默认继续传递，传递给当前onInterceptTouchEvent。







<commit_msg>Update 2015-5-20-android事件传递分析.md<commit_after>---
layout: post
author: mxn
titile: android事件传递分析
category: 技术博文
tag: android
---

android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法：

1）public boolean dispatchTouchEvent(MotionEvent ev)          这个方法用来分发TouchEvent

2）public boolean onInterceptTouchEvent(MotionEvent ev)         这个方法用来拦截TouchEvent

3）public boolean onTouchEvent(MotionEvent ev)                 这个方法用来处理TouchEvent

注意：不是所有的View的子类，只有可以向里面添加View的控件才需要分发，比如TextView它本身就是最小的view了，所以不用再向它的子视图分发了，它也没有子视图了，所以它没有dispatch和Intercept，只有touchEvent。而 Activity 对 onInterceptTouchEvent(MotionEvent ev) 也就是事件拦截不进行响应。


##三个方法的用法
####dispatchTouchEvent():用来分派事件。
其中调用了onInterceptTouchEvent()和onTouchEvent()，一般不重写该方法。

Touch 事件发生时 Activity 的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式（从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递）将事件传递给最外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法，并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑如下：

如果 return true，事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费，同时事件会停止向下传递；
如果 return false，会将事件返回给父 View 的  onTouchEvent 进行消费。
如果返回系统默认的 super.dispatchTouchEvent(ev)，事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。

注意：dispatchTouchEvent()的三种返回值效果各不相同。可简单理解为：
返回true,不传给别人，自己消费，事件消失；
返回false,向上传递，即反方向返回传递，向父类onTouchEvent传递
返回super.dispatchTouchEvent(ev),默认继续传递，传递给当前onInterceptTouchEvent。

####onInterceptTouchEvent():用来拦截事件。

在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下，事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑如下：

如果 onInterceptTouchEvent 返回 true，则表示将事件进行拦截，并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理；
如果 onInterceptTouchEvent 返回 false，则表示将事件放行，当前 View 上的事件会被传递到子 View 上，再由子 View 的 dispatchTouchEvent 来开始这个事件的分发；
如果 onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),同false效果，将事件放行。










{'fraction_non_alphanumeric': 0.06723484848484848, 'fraction_numerical': 0.004103535353535354, 'mean_word_length': 8.720858895705522, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '815561', 'n_tokens_mistral': 1622, 'n_tokens_neox': 1769, 'n_words': 195}