1.事件分发由这三个很重要的方法共同完成dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,先介绍这三个方法
public boolean dispatchTouchEvent(MotionEvent ev){
boolean consume=false;
if (onInterceptTouchEvent(ev)){
consume=onTouchEvent(ev);
}else{
consume=child.dispatchTouchEvent(ev);
}
return consume;
}
1.1 public boolean dispatchTouchEvent(MotionEvent ev):
用来进行事件的分发,如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent方法和下级View的diapatchTouchEvent方法的影响。表示是否消耗该事件。
1.2 public boolean onInterceptTouchEvent(MotionEvent ev):
在diapatchTouchEvent 方法内部调用,表示是否拦截改事件。如果拦截了事件,那么在同一个事件序列中,该方法不会再次执行。(onInterceptTouchEvent 拦截后,后续事件默认交给它处理)
1.3 public boolean onTouchEvent(MotionEvent event)
用来处理点击事件,返回结果表示是否消耗该事件,如果不消耗,那么同一个事件序列中,当前View无法再次收到事件。
2.关于事件传递机制,有以下结论:
2.1 同一个事件序列表示从手指接触屏幕起到手指离开屏幕结束所产生的的一系列事件。包括一个ACTION_DOWN,和0个或多个ACTION_MOVE,以及一个ACTION_UP。
2.2 正常情况下一个事件序列只能被一个View拦截消耗,
2.3 一旦一个View决定拦截事件,那么这一个事件序列都只能由他处理(如果事件能够传递给它),并且它的onInterceptTouchEvent只有第一次会调用(即拦截当前事件会默认拦截后续事件)。
2.4 如果View决定处理事件,但是又不消耗(onTouchEvent返回false),那么后续事件都不会再传递给它,并且后续事件交给它的父元素处理(执行父元素的onTouchEvent)
先做一个验证:布局文件很简单,不再赘述,MyLinearLayout1,MyLinearLayout2没什么说的,就是打一个log,MyTextView的onTouchEvent返回true表示消耗事件。
<?xml version="1.0" encoding="utf-8"?>
<com.example.scrollviews.MyLinearLayout1 xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear1"
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"
android:orientation="vertical"
android:background="#ffcccc"
tools:context="com.example.scrollviews.DispatchActivity">
<com.example.scrollviews.MyLinearLayout2
android:id="@+id/linear2"
android:background="#ff0000"
android:layout_width="400dp"
android:orientation="vertical"
android:layout_height="400dp">
<com.example.scrollviews.MyTextView
android:id="@+id/view"
android:background="#000"
android:layout_width="300dp"
android:layout_height="300dp" />
</com.example.scrollviews.MyLinearLayout2>
</com.example.scrollviews.MyLinearLayout1>
package com.example.scrollviews;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class MyLinearLayout1 extends LinearLayout {
public MyLinearLayout1(Context context) {
super(context);
}
public MyLinearLayout1(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyLinearLayout1(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private static final String TAG = "lwx-MyLinearLayout1";
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.e(TAG, "dispatchTouchEvent: " );
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e(TAG, "onInterceptTouchEvent: " );
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TAG, "onTouchEvent: " );
return super.onTouchEvent(event);
}
}
package com.example.scrollviews;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class MyLinearLayout2 extends LinearLayout {
public MyLinearLayout2(Context context) {
super(context);
}
public MyLinearLayout2(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyLinearLayout2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private static final String TAG = "lwx-MyLinearLayout2";
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.e(TAG, "dispatchTouchEvent: " );
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e(TAG, "onInterceptTouchEvent: " );
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TAG, "onTouchEvent: " );
return super.onTouchEvent(event);
}
}
package com.example.scrollviews;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import androidx.appcompat.widget.AppCompatTextView;
import org.w3c.dom.Text;
public class MyTextView extends AppCompatTextView {
public MyTextView(Context context) {
super(context);
}
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private static final String TAG = "lwx-MyTextView";
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.e(TAG, "lwx--dispatchTouchEvent: " );
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TAG, "lwx--onTouchEvent: "+event.getAction() );
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.e(TAG, "onTouchEvent: ---Down" );
return true;
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "onTouchEvent: ---Move" );
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
Log.e(TAG, "onTouchEvent: ---up|cancel" );
break;
}
return super.onTouchEvent(event);
}
}
2019-09-28 17:12:54.128 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 17:12:54.128 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 17:12:54.128 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 17:12:54.128 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 17:12:54.128 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 17:12:54.129 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 0
2019-09-28 17:12:54.129 18350-18350/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Down
2019-09-28 17:12:54.212 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 17:12:54.212 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 17:12:54.212 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 17:12:54.212 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 17:12:54.212 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 17:12:54.212 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 2
2019-09-28 17:12:54.212 18350-18350/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Move
2019-09-28 17:12:54.228 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 17:12:54.228 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 17:12:54.228 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 17:12:54.228 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 17:12:54.228 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 17:12:54.228 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 2
2019-09-28 17:12:54.228 18350-18350/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Move
2019-09-28 17:12:54.234 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 17:12:54.234 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 17:12:54.234 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 17:12:54.234 18350-18350/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 17:12:54.234 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 17:12:54.234 18350-18350/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 1
2019-09-28 17:12:54.234 18350-18350/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---up|cancel
此示例中事件由MyLinearLayout1开始往下传,执行dispatchTouchEvent方法,然后执行内部onInterceptTouchEvent,由于ViewGroup默认不拦截事件,所以传递给MyLinearLayout2,执行MyLinearLayout2的dispatchTouchEvent,然后执行MyLinearLayout2内部的onInterceptTouchEvent,继续传递给MyTextView,View没有onInterceptTouchEvent方法。如果传递到View,就一定会执行View的onTouchEvent方法。如2.2,2.3所说,在ACTION_DOWN中MyTextView,拦截并消耗了ACTION_DOWN。那么此后的一系列事件都是由MyTextView拦截消耗(MOVE,UP)。
如果MyTextView的onTouchEvent返回false,按照2.4所说。后续事件都不会交给它处理,并交给父元素处理。同理由于父元素的onTouchEvent也返回false,那么后续的ACTION_MOVE和ACTION_UP事件不会得到任何执行。
验证:
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TAG, "lwx--onTouchEvent: "+event.getAction() );
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.e(TAG, "onTouchEvent: ---Down" );
return false;
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "onTouchEvent: ---Move" );
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
Log.e(TAG, "onTouchEvent: ---up|cancel" );
break;
}
return super.onTouchEvent(event);
}
2019-09-28 19:29:12.136 28236-28236/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 19:29:12.136 28236-28236/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 19:29:12.136 28236-28236/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 19:29:12.136 28236-28236/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 19:29:12.136 28236-28236/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 19:29:12.137 28236-28236/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 0
2019-09-28 19:29:12.137 28236-28236/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Down
2019-09-28 19:29:12.138 28236-28236/com.example.scrollmviews E/lwx-MyLinearLayout2: onTouchEvent:
2019-09-28 19:29:12.138 28236-28236/com.example.scrollmviews E/lwx-MyLinearLayout1: onTouchEvent:
2.5 如果View消耗了ACTION_DOWN事件,但是不消耗后续事件,View依旧会收到后续事件,但Activity也会受到后续时件,而View的父元素不会收到后续事件。
在Activity中重写onTouchEvent方法
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("lwx--"+TAG, "onTouchEvent: " );
return super.onTouchEvent(event);
}
2019-09-28 19:38:07.261 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 19:38:07.261 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 19:38:07.261 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 19:38:07.261 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 19:38:07.261 29496-29496/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 19:38:07.262 29496-29496/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 0
2019-09-28 19:38:07.262 29496-29496/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Down
2019-09-28 19:38:07.315 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 19:38:07.315 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 19:38:07.316 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 19:38:07.316 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 19:38:07.316 29496-29496/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 19:38:07.316 29496-29496/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 2
2019-09-28 19:38:07.316 29496-29496/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Move
2019-09-28 19:38:07.316 29496-29496/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2019-09-28 19:38:07.504 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 19:38:07.504 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 19:38:07.504 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 19:38:07.504 29496-29496/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 19:38:07.504 29496-29496/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 19:38:07.504 29496-29496/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 1
2019-09-28 19:38:07.505 29496-29496/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---up|cancel
2019-09-28 19:38:07.505 29496-29496/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2.6 ViewGroup默认不拦截任何事件,Android源码的ViewGroup的onInterceptTouchEvent返回false
2.7 View没有onInterceptTouchEvent方法,一旦有事件传递给它,它的onTouchEvent会立即调用。
2.8 View的onTouchEvent默认消耗事件(返回true),除非他是不可点击的。
2.9 onClick会发生的前提是View是可点击的,并且它能够收到ACTION_DOWN和ACTION_UP事件。
2.10 事件分发是由外往内的,事件总是先传递给父元素,再由父元素分发给子View。通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但ACTION_DOWN除外。
验证:如果在MyLinearLayout2中我们拦截除了down的事件,那么它的log是这样的。MyTextView会处理第一个ACTION_DOWN事件,以及后续的ACTION_CANCEL事件,后续的ACTION_MOVE和ACTION_UP事件由MyTextView的父元素MyLinearLayout2处理,但是MyLinearLayout2的onTouchEvent返回false,所以Activity的onTouchEvent也会得到执行。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.e(TAG, "onInterceptTouchEvent: " );
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
return super.onInterceptTouchEvent(ev);
}
return true;
}
2019-09-28 20:02:07.665 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:02:07.666 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 20:02:07.666 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:02:07.666 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 20:02:07.666 31633-31633/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:02:07.666 31633-31633/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 0
2019-09-28 20:02:07.666 31633-31633/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Down
2019-09-28 20:02:07.716 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:02:07.716 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 20:02:07.717 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:02:07.717 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 20:02:07.717 31633-31633/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:02:07.717 31633-31633/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 3
2019-09-28 20:02:07.717 31633-31633/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---up|cancel
2019-09-28 20:02:07.717 31633-31633/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2019-09-28 20:02:07.732 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:02:07.732 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 20:02:07.732 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:02:07.732 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: onTouchEvent:
2019-09-28 20:02:07.732 31633-31633/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2019-09-28 20:02:07.749 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:02:07.749 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 20:02:07.749 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:02:07.749 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: onTouchEvent:
2019-09-28 20:02:07.749 31633-31633/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2019-09-28 20:02:07.955 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:02:07.955 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 20:02:07.955 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:02:07.955 31633-31633/com.example.scrollmviews E/lwx-MyLinearLayout2: onTouchEvent:
2019-09-28 20:02:07.956 31633-31633/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
如果调用了requestDisallowInterceptTouchEvent方法那么,log和MyLinearLayout2没有拦截事件是一样的。
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e(TAG, "lwx--onTouchEvent: "+event.getAction() );
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
Log.e(TAG, "onTouchEvent: ---Down" );
return true;
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "onTouchEvent: ---Move" );
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
Log.e(TAG, "onTouchEvent: ---up|cancel" );
break;
}
return super.onTouchEvent(event);
}
2019-09-28 20:07:43.741 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:07:43.741 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 20:07:43.741 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:07:43.741 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 20:07:43.741 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:07:43.742 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 0
2019-09-28 20:07:43.742 31999-31999/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Down
2019-09-28 20:07:43.789 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:07:43.789 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:07:43.789 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:07:43.790 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 2
2019-09-28 20:07:43.790 31999-31999/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Move
2019-09-28 20:07:43.791 31999-31999/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2019-09-28 20:07:43.806 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:07:43.806 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:07:43.806 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:07:43.806 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 2
2019-09-28 20:07:43.806 31999-31999/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Move
2019-09-28 20:07:43.807 31999-31999/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2019-09-28 20:07:43.912 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:07:43.912 31999-31999/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:07:43.912 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:07:43.912 31999-31999/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 1
2019-09-28 20:07:43.912 31999-31999/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---up|cancel
2019-09-28 20:07:43.913 31999-31999/com.example.scrollmviews E/lwx--DispatchActivity: onTouchEvent:
2.11 onTouchListener会屏蔽掉onTouchEvent,在onTouchEvent中会执行onClick方法。
onTouchEvent得到执行的前提是,view没有设置onTouchListener,或者onTouch方法返回false。
@Override
public boolean onTouchEvent(MotionEvent event) {
//注意要加这个super.onTouchEvent(event);否则不会执行onclick
super.onTouchEvent(event);
Log.e(TAG, "lwx--onTouchEvent: "+event.getAction() );
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
Log.e(TAG, "onTouchEvent: ---Down" );
return true;
case MotionEvent.ACTION_MOVE:
Log.e(TAG, "onTouchEvent: ---Move" );
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
Log.e(TAG, "onTouchEvent: ---up|cancel" );
break;
}
return super.onTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("lwx--"+TAG, "onTouchEvent: " );
return super.onTouchEvent(event);
}
2019-09-28 20:24:10.841 2132-2132/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:24:10.842 2132-2132/com.example.scrollmviews E/lwx-MyLinearLayout1: onInterceptTouchEvent:
2019-09-28 20:24:10.842 2132-2132/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:24:10.842 2132-2132/com.example.scrollmviews E/lwx-MyLinearLayout2: onInterceptTouchEvent:
2019-09-28 20:24:10.842 2132-2132/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:24:10.843 2132-2132/com.example.scrollmviews E/lwx--MyTextView: onTouch:
2019-09-28 20:24:10.849 2132-2132/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 0
2019-09-28 20:24:10.849 2132-2132/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---Down
--------- beginning of system
2019-09-28 20:24:10.937 2132-2132/com.example.scrollmviews E/lwx-MyLinearLayout1: dispatchTouchEvent:
2019-09-28 20:24:10.937 2132-2132/com.example.scrollmviews E/lwx-MyLinearLayout2: dispatchTouchEvent:
2019-09-28 20:24:10.938 2132-2132/com.example.scrollmviews E/lwx-MyTextView: lwx--dispatchTouchEvent:
2019-09-28 20:24:10.938 2132-2132/com.example.scrollmviews E/lwx--MyTextView: onTouch:
2019-09-28 20:24:10.939 2132-2132/com.example.scrollmviews E/lwx-MyTextView: lwx--onTouchEvent: 1
2019-09-28 20:24:10.939 2132-2132/com.example.scrollmviews E/lwx-MyTextView: onTouchEvent: ---up|cancel
2019-09-28 20:24:10.941 2132-2132/com.example.scrollmviews E/lwx--MyTextView: onClick:
当onTouch方法返回true,onTouchEvent不会得到执行。