总结

dispatchTouchEvent方法:分发点击事件
onInterceptTouchEvent方法:拦截事件(只存在于ViewGroup,View没有此方法), 在dispatchTouchEvent方法内部调用
onTouchEvent方法:处理点击事件,在dispatchTouchEvent方法内部调用

示例代码

自定义View-MyLinearLayout

public class MyLinearLayout extends LinearLayout {private static String TAG = "test";public MyLinearLayout(Context context) {this(context,null);}public MyLinearLayout(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public MyLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);}private void initView(Context context) {}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "MyLinearLayout-dispatchTouchEvent-down");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "MyLinearLayout-dispatchTouchEvent-move");break;case MotionEvent.ACTION_UP:Log.d(TAG, "MyLinearLayout-dispatchTouchEvent-up");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "MyLinearLayout-dispatchTouchEvent-cancel");break;}return super.dispatchTouchEvent(event);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "MyLinearLayout-onInterceptTouchEvent-down");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "MyLinearLayout-onInterceptTouchEvent-move");break;case MotionEvent.ACTION_UP:Log.d(TAG, "MyLinearLayout-onInterceptTouchEvent-up");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "MyLinearLayout-onInterceptTouchEvent-cancel");break;}return super.onInterceptTouchEvent(event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "MyLinearLayout-onTouchEvent-down");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "MyLinearLayout-onTouchEvent-move");break;case MotionEvent.ACTION_UP:Log.d(TAG, "MyLinearLayout-onTouchEvent-up");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "MyLinearLayout-onTouchEvent-cancel");break;}return super.onTouchEvent(event);}
}

自定义View-MyButton

public class MyButton extends android.support.v7.widget.AppCompatButton {private static String TAG = "test";public MyButton(Context context) {this(context, null);}public MyButton(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);}private void initView(Context context) {}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "MyButton-dispatchTouchEvent-down");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "MyButton-dispatchTouchEvent-move");break;case MotionEvent.ACTION_UP:Log.d(TAG, "MyButton-dispatchTouchEvent-up");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "MyButton-dispatchTouchEvent-cancel");break;}return super.dispatchTouchEvent(event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "MyButton-onTouchEvent-down");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "MyButton-onTouchEvent-move");break;case MotionEvent.ACTION_UP:Log.d(TAG, "MyButton-onTouchEvent-up");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "MyButton-onTouchEvent-cancel");break;}return super.onTouchEvent(event);}
}

MainActivity

public class TestActivity extends AppCompatActivity {private MyLinearLayout mLlRoot;private MyButton mBtn1;private static String TAG = "test";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_three);initView();}private void initView() {mLlRoot = (MyLinearLayout) findViewById(R.id.ll_root);mBtn1 = (MyButton) findViewById(R.id.btn1);}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "Activity-dispatchTouchEvent-down");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "Activity-dispatchTouchEvent-move");break;case MotionEvent.ACTION_UP:Log.d(TAG, "Activity-dispatchTouchEvent-up");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "threeActivity-dispatchTouchEvent-cancel");break;}return super.dispatchTouchEvent(event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:Log.d(TAG, "Activity-onTouchEvent-down");break;case MotionEvent.ACTION_MOVE:Log.d(TAG, "Activity-onTouchEvent-move");break;case MotionEvent.ACTION_UP:Log.d(TAG, "Activity-onTouchEvent-up");break;case MotionEvent.ACTION_CANCEL:Log.d(TAG, "Activity-onTouchEvent-cancel");break;}return super.onTouchEvent(event);}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><com.cn.liuyz.javademo.autoView.MyLinearLayoutandroid:id="@+id/ll_root"android:layout_width="match_parent"android:orientation="horizontal"android:background="#888"android:layout_height="500dp"><com.cn.liuyz.javademo.autoView.MyButtonandroid:id="@+id/btn1"android:text="你好"android:background="#f00"android:layout_width="200dp"android:layout_gravity="center"android:layout_height="200dp"/></com.cn.liuyz.javademo.autoView.MyLinearLayout></LinearLayout>

默认情况下事件传递

从Activity –> ViewGroup(MyLinearLayout) –> View(MyButton),从上往下调用dispatchTouchEvent()

再由View(MyButton) –> ViewGroup(MyLinearLayout) –> Activity,从下往上调用onTouchEvent()

ViewGroup中

dispatchTouchEvent

dispatchTouchEvent返回super.dispatchTouchEvent(event)

  • 调用dispatchTouchEvent方法内部的onInterceptTouchEvent方法

dispatchTouchEvent返回true

  • 消费事件,事件不会往下传递
  • dispatchTouchEvent后续的ACTION_MOVE、ACTION_UP事件继续执行(后续事件会继续分发到该ViewGroup)

dispatchTouchEvent返回false

  • 不消费事件,事件停止传递
  • 将事件向上传给父控件的onTouchEvent处理
  • dispatchTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)

onInterceptTouchEvent

onInterceptTouchEvent返回super.onInterceptTouchEvent(event)

  • 不拦截事件,事件继续往下传递
  • onInterceptTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行
  • 同一个事件序列中同一个ViewGroup的onInterceptTouchEvent方法只会调用一次

onInterceptTouchEvent返回true

  • 拦截事件,事件不会往下传递
  • 传递给自己的onTouchEvent处理
  • onInterceptTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行

onInterceptTouchEvent返回false

  • 不拦截事件,事件继续往下传递
  • onInterceptTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行
  • ViewGroup默认是不拦截的,所以super==false

onTouchEvent

onTouchEvent返回super.onTouchEvent(event)

  • 不消费事件,事件继续往上传递
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)

onTouchEvent返回true

  • 处理事件,事件停止传递
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件继续执行(后续事件会继续分发到该ViewGroup)

onTouchEvent返回false

  • 不处理事件,传递给父控件onTouchEvent处理
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)

View中

dispatchTouchEvent

dispatchTouchEvent返回super.dispatchTouchEvent(event)

  • 调用dispatchTouchEvent方法内部的onTouchEvent方法
  • 是否消费事件取决于onTouchEvent的返回值

dispatchTouchEvent返回true

  • 消费事件,事件不会往下传递
  • dispatchTouchEvent后续的ACTION_MOVE、ACTION_UP事件继续执行(后续事件会继续分发到该ViewGroup)

dispatchTouchEvent返回false

  • 不消费事件
  • 将事件向上传给父控件的onTouchEvent处理
  • dispatchTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)

onTouchEvent

onTouchEvent返回super.onTouchEvent(event)

  • 不处理事件,事件继续往上传递
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行

onTouchEvent返回true

  • 处理事件,事件停止传递
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件继续执行(后续事件会继续分发到该ViewGroup)

onTouchEvent返回false

  • 不处理事件
  • 将事件向上传给父控件的onTouchEvent处理
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)
  • View的默认实现是不处理事件。所以super.onTouchEvent(event)==false

注意

  • ViewGroup和View的dispatchTouchEvent和onTouchEvent方法 return false的时候事件都会向上传给父控件的onTouchEvent处理
  • ViewGroup的onInterceptTouchEvent 默认是不拦截的,所以return super.onInterceptTouchEvent()和return false一样
  • View的onTouchEvent默认是不处理事件。所以super.onTouchEvent(event)和false一样
  • ViewGroup要想把事件分发给自己的onTouchEvent,只有返回super.dispatchTouchEvent(event),调用内部onInterceptTouchEvent方法并return true,才会调用自己的onTouchEvent方法。其他方法都不行
  • View要想把事件分发给自己的onTouchEvent,只有返回super.dispatchTouchEvent(event),才会调用自己的onTouchEvent方法,其他方法都不行

示例结果分析

全是默认返回值,点击一下

11-14 16:06:18.787 29278-29278/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:06:18.788 29278-29278/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:06:18.788 29278-29278/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:06:18.788 29278-29278/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:06:18.788 29278-29278/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-down
11-14 16:06:18.788 29278-29278/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:06:18.791 29278-29278/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-down
11-14 16:06:18.844 29278-29278/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:06:18.844 29278-29278/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:06:18.861 29278-29278/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:06:18.861 29278-29278/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:06:18.944 29278-29278/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:06:18.944 29278-29278/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-up

默认情况下事件传递
从Activity –> ViewGroup(MyLinearLayout) –> View(MyButton),从上往下调用dispatchTouchEvent()
再由View(MyButton) –> ViewGroup(MyLinearLayout) –> Activity,从下往上调用onTouchEvent()

注意
同一个事件序列中同一个ViewGroup的onInterceptTouchEvent方法只会调用一次

1、如果在MyLinearLayout的dispatchTouchEvent中返回true

11-14 16:30:44.311 32234-32234/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:30:44.312 32234-32234/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:30:44.351 32234-32234/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:30:44.351 32234-32234/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:30:44.368 32234-32234/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:30:44.368 32234-32234/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:30:44.384 32234-32234/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:30:44.384 32234-32234/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:30:44.441 32234-32234/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:30:44.441 32234-32234/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-up
  • 消费事件,事件不会往下传递
  • dispatchTouchEvent的ACTION_MOVE、ACTION_UP事件继续执行(后续事件会继续分发到该ViewGroup)

2、如果在MyLinearLayout的dispatchTouchEvent中返回false

11-14 16:32:42.088 32717-32717/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:32:42.089 32717-32717/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:32:42.092 32717-32717/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-down
11-14 16:32:42.136 32717-32717/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:32:42.136 32717-32717/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:32:42.152 32717-32717/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:32:42.152 32717-32717/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:32:42.169 32717-32717/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:32:42.169 32717-32717/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:32:42.201 32717-32717/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:32:42.201 32717-32717/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-up
  • 不消费事件,事件停止传递
  • 将事件向上传给父控件的onTouchEvent处理
  • dispatchTouchEvent的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)

3、如果在MyLinearLayout的onInterceptTouchEvent中返回true

11-14 16:36:09.430 880-880/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:36:09.431 880-880/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:36:09.431 880-880/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:36:09.431 880-880/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:36:09.437 880-880/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-down
11-14 16:36:09.519 880-880/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:36:09.520 880-880/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:36:09.526 880-880/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:36:09.527 880-880/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:36:09.528 880-880/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:36:09.528 880-880/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-up
  • 不拦截事件,事件继续往下传递
  • onInterceptTouchEvent的ACTION_MOVE、ACTION_UP事件不再执行
  • 同一个事件序列中同一个ViewGroup的onInterceptTouchEvent方法只会调用一次

4、如果在MyLinearLayout的onInterceptTouchEvent中返回true、onTouchEvent中返回true

11-14 16:41:08.186 1143-1143/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:41:08.188 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:41:08.188 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:41:08.189 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:41:08.259 1143-1143/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:41:08.259 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:41:08.259 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-move
11-14 16:41:08.276 1143-1143/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:41:08.276 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:41:08.276 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-move
11-14 16:41:08.292 1143-1143/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:41:08.292 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:41:08.293 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-move
11-14 16:41:08.343 1143-1143/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:41:08.343 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-up
11-14 16:41:08.343 1143-1143/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-up
  • 不拦截事件,事件继续往下传递
  • onInterceptTouchEvent的ACTION_MOVE、ACTION_UP事件不再执行
  • 同一个事件序列中同一个ViewGroup的onInterceptTouchEvent方法只会调用一次

注意
ViewGroup 想把事件分发给自己的onTouchEvent,需要拦截器onInterceptTouchEvent方法return true 把事件拦截下来。

5、如果在MyLinearLayout的onInterceptTouchEvent中返回false

11-14 16:44:38.127 1534-1534/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:44:38.127 1534-1534/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:44:38.127 1534-1534/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:44:38.127 1534-1534/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:44:38.128 1534-1534/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-down
11-14 16:44:38.128 1534-1534/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:44:38.129 1534-1534/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-down
11-14 16:44:38.182 1534-1534/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:44:38.182 1534-1534/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:44:38.199 1534-1534/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:44:38.199 1534-1534/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:44:38.223 1534-1534/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:44:38.224 1534-1534/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-up
  • 拦截事件,事件不会往下传递
  • 传递给自己的onTouchEvent处理
  • onInterceptTouchEvent的ACTION_MOVE、ACTION_UP事件不再执行

注意
ViewGroup的拦截器onInterceptTouchEvent 默认是不拦截的,所以return super.onInterceptTouchEvent()=return false

6、如果在MyLinearLayout的onTouchEvent中返回true

11-14 16:46:08.074 1884-1884/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:46:08.075 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:46:08.075 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:46:08.075 1884-1884/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:46:08.076 1884-1884/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-down
11-14 16:46:08.076 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:46:08.140 1884-1884/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:46:08.141 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:46:08.141 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-move
11-14 16:46:08.157 1884-1884/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:46:08.157 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:46:08.157 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-move
11-14 16:46:08.174 1884-1884/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:46:08.174 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:46:08.174 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-move
11-14 16:46:08.241 1884-1884/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:46:08.241 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-up
11-14 16:46:08.241 1884-1884/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-up
  • 不消费事件,事件继续往上传递
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行(后续事件会继续分发到该ViewGroup)

7、如果在MyLinearLayout的onTouchEvent中返回false

11-14 16:48:34.671 2190-2190/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:48:34.672 2190-2190/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:48:34.672 2190-2190/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:48:34.672 2190-2190/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:48:34.673 2190-2190/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-down
11-14 16:48:34.674 2190-2190/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:48:34.676 2190-2190/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-down
11-14 16:48:34.785 2190-2190/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:48:34.785 2190-2190/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:48:34.802 2190-2190/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:48:34.802 2190-2190/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:48:34.819 2190-2190/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:48:34.820 2190-2190/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:48:34.867 2190-2190/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:48:34.867 2190-2190/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-up
  • 不处理事件,传递给父控件onTouchEvent处理
  • onTouchEvent的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)

8、如果在MyButton的dispatchTouchEvent中返回true

11-14 16:50:14.361 2408-2408/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:50:14.361 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:50:14.362 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:50:14.362 2408-2408/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:50:14.458 2408-2408/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:50:14.458 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:50:14.458 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-move
11-14 16:50:14.458 2408-2408/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-move
11-14 16:50:14.474 2408-2408/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:50:14.474 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:50:14.474 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-move
11-14 16:50:14.475 2408-2408/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-move
11-14 16:50:14.491 2408-2408/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:50:14.491 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:50:14.491 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-move
11-14 16:50:14.491 2408-2408/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-move
11-14 16:50:14.549 2408-2408/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:50:14.549 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-up
11-14 16:50:14.549 2408-2408/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-up
11-14 16:50:14.549 2408-2408/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-up
  • 消费事件,事件不会往下传递
  • dispatchTouchEvent的ACTION_MOVE、ACTION_UP事件继续执行(后续事件会继续分发到该View)

9、如果在MyButton的dispatchTouchEvent中返回false

11-14 16:53:13.553 2734-2734/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:53:13.554 2734-2734/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:53:13.555 2734-2734/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:53:13.555 2734-2734/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:53:13.555 2734-2734/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:53:13.558 2734-2734/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-down
11-14 16:53:13.726 2734-2734/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:53:13.726 2734-2734/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:53:13.733 2734-2734/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:53:13.733 2734-2734/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:53:13.734 2734-2734/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:53:13.734 2734-2734/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-up
  • 不消费事件
  • 将事件向上传给父控件的onTouchEvent处理
  • dispatchTouchEvent的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该View)

注意
View 没有拦截器,为了让View可以把事件分发给自己的onTouchEvent,View的dispatchTouchEvent默认实现(super)就是把事件分发给自己的onTouchEvent

10、如果在MyButton的onTouchEvent中返回true

11-14 16:55:08.718 2992-2992/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:55:08.718 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:55:08.720 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:55:08.720 2992-2992/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:55:08.720 2992-2992/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-down
11-14 16:55:08.807 2992-2992/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:55:08.807 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:55:08.807 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-move
11-14 16:55:08.807 2992-2992/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-move
11-14 16:55:08.807 2992-2992/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-move
11-14 16:55:08.823 2992-2992/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:55:08.823 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-move
11-14 16:55:08.823 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-move
11-14 16:55:08.823 2992-2992/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-move
11-14 16:55:08.824 2992-2992/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-move
11-14 16:55:08.867 2992-2992/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:55:08.867 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-up
11-14 16:55:08.867 2992-2992/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-up
11-14 16:55:08.867 2992-2992/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-up
11-14 16:55:08.867 2992-2992/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-up
  • 处理事件,事件停止传递
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件继续执行(后续事件会继续分发到该ViewGroup)

11、如果在MyButton的onTouchEvent中返回false

11-14 16:56:37.628 3205-3205/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-down
11-14 16:56:37.628 3205-3205/com.cn.liuyz.javademo D/test: MyLinearLayout-dispatchTouchEvent-down
11-14 16:56:37.628 3205-3205/com.cn.liuyz.javademo D/test: MyLinearLayout-onInterceptTouchEvent-down
11-14 16:56:37.629 3205-3205/com.cn.liuyz.javademo D/test: MyButton-dispatchTouchEvent-down
11-14 16:56:37.629 3205-3205/com.cn.liuyz.javademo D/test: MyButton-onTouchEvent-down
11-14 16:56:37.629 3205-3205/com.cn.liuyz.javademo D/test: MyLinearLayout-onTouchEvent-down
11-14 16:56:37.631 3205-3205/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-down
11-14 16:56:37.718 3205-3205/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:56:37.718 3205-3205/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:56:37.735 3205-3205/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-move
11-14 16:56:37.735 3205-3205/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-move
11-14 16:56:37.784 3205-3205/com.cn.liuyz.javademo D/test: Activity-dispatchTouchEvent-up
11-14 16:56:37.784 3205-3205/com.cn.liuyz.javademo D/test: Activity-onTouchEvent-up
  • 不处理事件
  • 将事件向上传给父控件的onTouchEvent处理
  • onTouchEvent后续的ACTION_MOVE、ACTION_UP事件不再执行(后续事件将不会分发给该ViewGroup)
  • View的默认实现是不消费的。所以super==false

onTouch和onTouchEvent区别和使用

这两个方法都是在View的dispatchTouchEvent中调用,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会执行。

onTouch能执行需要两个条件,第一mOnTouchListener值不能为空,第二当前点击的控件必须是enable。因此如果控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。

Android事件传递机制详解相关推荐

  1. Android 系统(199)---Android事件分发机制详解

    Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...

  2. View的事件体系之三 android事件分发机制详解(下)

    接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...

  3. Android事件分发机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 之前在学习Android事件方法机制的时候,看过不少文章,但是大部分都讲的不是很清楚,我自己理解的也是云里雾里,也尝试过阅读源 ...

  4. Android事件分发机制详解及解决文案:史上最全面、最易懂

    点击屏幕Android事件是如何传递,先上图然后再源码解读 源码解读 当用户触摸屏幕首先由当前Activity来分发 public class TouchEventActivity extends A ...

  5. 安卓自定义View进阶-事件分发机制详解

    原文地址:http://www.gcssloop.com/customview/dispatch-touchevent-source Android 事件分发机制详解,在上一篇文章 事件分发机制原理  ...

  6. android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...

    本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...

  7. Android设备扫描机制详解

    Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...

  8. Android事件传递机制(转)

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

  9. Android 事件传递机制总结

    Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...

最新文章

  1. Google I/O 2017 大会时间表出炉:安卓 8.0 时代来临
  2. linux shell expr命令 字符串操作
  3. Fabric 架构和概念
  4. 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
  5. 五款常用邮件管理系统评测
  6. 玩转Github —— Octotree Chrome插件
  7. 【通信原理课程设计】8PSK调制解调技术的设计与仿真(MATLAB)
  8. Exchange Server 2003 部署手册
  9. android 图片传递,如何使用包在Android活动之间传递图像(位图)?
  10. CSS 单词折行 word-wrap属性
  11. jidnserror.wo.com.cn:8080错误解决方法
  12. 拿过3个重点、8个面上的专家:申请国家基金心得与体会
  13. html js 读取资源文件,javascript如何读取文件?
  14. 快递物流类API推荐
  15. 极化SAR几种成像模式
  16. set(gca,'fontsize',8);
  17. [Fourier]傅里叶级数中虚数部分j去了哪里
  18. HDMI切换器的各种版本能不能互通?
  19. hdu1296多项式
  20. 【数据库SQL实战】获取员工其当前的薪水比其manager当前薪水还高的相关信息

热门文章

  1. Laravel框架配置日志按天生成在文件中
  2. 2023年“华数杯”国际大学生数学建模A题赛题发布
  3. Windows查看TCP连接(netstat)
  4. 树莓派玩转WIN10之安装篇
  5. 面试题:MySQL部分
  6. 经常被遗忘的 iOS 源码仓库 - Code4App
  7. 如何在网页中实现右上角“平方”、右下角那种数字的写法?
  8. Android.mk 入门学习
  9. 《细胞》重磅!科学家成功培育全球首个人类自组织心脏类器官,可自主跳动且能自我修复...
  10. mysql的查询语句大全_sql语句(sql数据库查询语句大全)