Android 事件分发学习记录
2020-11-23 本文已影响0人
zoustin
事件分发的几种流程记录
分发的大体流程:Activity -> ViewGroup -> View
参与分发的对象: Activity , ViewGroup ,View
分发事件状态:DOWN|MOVE|UP|CANCEL
发生场景:填充一个LinearLayout() ,里面放一个TextView, 大概情况如下👇
2020-11-23-10-18-51-image.png第一个测试:所有方法都默认调用super.xxx() , 【 点击View,移动 然后抬起】
1、回调结果:
2、过程抽象图:👇
❗ 通过,回调事件的过程抽象图,发现,(小橙色笑脸)点击事件绕了一圈,最后回传到Activity的onTouchEvent()方法。而 移动和抬起事件,直接传到Activity的onTouchEvent回调。
第二个测试:设置 Activity 的 dispatchTouchEvent() 返回 false 或者 true 。结果都一样【 点击View,移动 然后抬起】
1、测试结果:
2、过程抽象图:👇 2020-11-23-12-46-42-image.png
❗ 这个情况,没有回调到任何onTouchEvent方法
第三个测试:将ViewGroup的OnInterceptTouchEvent()方法,返回ture ,【 点击View,移动 然后抬起】
1、测试结果:
2、过程抽象图:👇
❗这个情况,因为点击事件被ViewGroup拦截,所以没有走到View的dispatchTouchEvent 和onTouchEvent事件,View 不参与分发和响应 ,直接通过ViewGroup的onTouchEvent() 回传到Activity去了,而移动和抬起事件,依然直接传到Activity自己的onTouchEvent()。
第四个测试:将View的dispatchTouchEvent返回true,【 点击View,移动 然后抬起】
1、测试结果:
2、过程抽象图:👇
2020-11-23-10-28-20-image.png
❗ 这个情况,三个对象都没有回调onTouchEvent()方法
第五个测试:将View的dispatchTouchEvent返回false,【 点击View,移动 然后抬起】
1、测试结果:
2、过程抽象图:👇
2020-11-23-10-50-56-image.png
❗ 这个情况View 的 dispatchTouchEvent 不分发,直接回调到ViewGroup 的 onTouchEvent()
第六个测试:将View的onTouchEvent() 返回 true,【 点击View,移动 然后抬起】
1、测试结果:
2、过程抽象图:👇
2020-11-23-12-22-58-image.png
❗ 这个情况,三个事件都被View接收响应了, 不会回调到Activity。
总结一下:
super指定是 super.xxxTouchEvent()之类的方法
dispatchTouchEvent | onInterceptTouchEvent | onTouchEvent | ||
---|---|---|---|---|
Activity | 1.返回true 或者false ,都只停留在Activity, 也不会回调任何onTouchEvent() 2.返回super分发下去 | 没有该方法 | 不做什么操作,都最终回传到这 | |
ViewGroup | 1.返回true , 传递到viewGroup 但是不会回调任何onTouchEvent()。 2.返回super 和 false 继续分发下去 | 返回true拦截事件,交给自己onTouchEvent() 返回false 或 super 继续分发下去 | 1返回true,三个事件都传到这 2返回false 或 super 回传到上级 | |
View | 1.返回true, 传到到View,但是不会任何响应onTouchEvent() 2.返回super 和 false ,继续分发下去 | 没有该方法 | 1返回true,三个事件都传到这 2返回false 或 super回传到上级 |
额外情况:当我们给View设置了onTouch事件返回true ,它会导致,不走onTouchEvent()这个方法,三个事件都会被onTouch消费了, onTouch的优先级 比 onTouchEevnt 高
View.setOnTouchListener((v, event) -> {
Toast.makeText(MainActivity.this, "点击事件", Toast.LENGTH_SHORT).show();
Log.e(TAG, "View -> setOnTouchListener" );
return true;
});
2020-11-23-15-53-11-image.png
2020-11-23-15-50-55-image.png