Android事件传递机制详解
总结
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事件传递机制详解相关推荐
- Android 系统(199)---Android事件分发机制详解
Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...
- View的事件体系之三 android事件分发机制详解(下)
接着上一篇来分析事件分发机制,在看了各位大牛的关于事件分发机制的分析后茅塞顿开,之前看过好几遍郭霖,弘扬以及玉刚大神关于事件体系的讲解,一直看不懂,比较模糊,最近复习时,看到一篇博文,写的相当精彩,看 ...
- Android事件分发机制详解
2019独角兽企业重金招聘Python工程师标准>>> 之前在学习Android事件方法机制的时候,看过不少文章,但是大部分都讲的不是很清楚,我自己理解的也是云里雾里,也尝试过阅读源 ...
- Android事件分发机制详解及解决文案:史上最全面、最易懂
点击屏幕Android事件是如何传递,先上图然后再源码解读 源码解读 当用户触摸屏幕首先由当前Activity来分发 public class TouchEventActivity extends A ...
- 安卓自定义View进阶-事件分发机制详解
原文地址:http://www.gcssloop.com/customview/dispatch-touchevent-source Android 事件分发机制详解,在上一篇文章 事件分发机制原理 ...
- android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
本文讲解TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件 Android 事件传递机制:Android 事件传递机制初涉 我们知道 Button ...
- Android设备扫描机制详解
Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...
- Android事件传递机制(转)
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
- Android 事件传递机制总结
Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件.初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get ...
最新文章
- Google I/O 2017 大会时间表出炉:安卓 8.0 时代来临
- linux shell expr命令 字符串操作
- Fabric 架构和概念
- 【组合数学】第一类,第二类斯特林数(Stirling),Bell数
- 五款常用邮件管理系统评测
- 玩转Github —— Octotree Chrome插件
- 【通信原理课程设计】8PSK调制解调技术的设计与仿真(MATLAB)
- Exchange Server 2003 部署手册
- android 图片传递,如何使用包在Android活动之间传递图像(位图)?
- CSS 单词折行 word-wrap属性
- jidnserror.wo.com.cn:8080错误解决方法
- 拿过3个重点、8个面上的专家:申请国家基金心得与体会
- html js 读取资源文件,javascript如何读取文件?
- 快递物流类API推荐
- 极化SAR几种成像模式
- set(gca,'fontsize',8);
- [Fourier]傅里叶级数中虚数部分j去了哪里
- HDMI切换器的各种版本能不能互通?
- hdu1296多项式
- 【数据库SQL实战】获取员工其当前的薪水比其manager当前薪水还高的相关信息
热门文章
- Laravel框架配置日志按天生成在文件中
- 2023年“华数杯”国际大学生数学建模A题赛题发布
- Windows查看TCP连接(netstat)
- 树莓派玩转WIN10之安装篇
- 面试题:MySQL部分
- 经常被遗忘的 iOS 源码仓库 - Code4App
- 如何在网页中实现右上角“平方”、右下角那种数字的写法?
- Android.mk 入门学习
- 《细胞》重磅!科学家成功培育全球首个人类自组织心脏类器官,可自主跳动且能自我修复...
- mysql的查询语句大全_sql语句(sql数据库查询语句大全)