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、回调结果:

snipaste_20201122_212026.png

2、过程抽象图:👇

snipaste_20201123_093456.png
❗ 通过,回调事件的过程抽象图,发现,(小橙色笑脸)点击事件绕了一圈,最后回传到Activity的onTouchEvent()方法。而 移动和抬起事件,直接传到Activity的onTouchEvent回调。
第二个测试:设置 Activity 的 dispatchTouchEvent() 返回 false 或者 true 。结果都一样【 点击View,移动 然后抬起】

1、测试结果:

2020-11-23-12-45-00-image.png
2、过程抽象图:👇 2020-11-23-12-46-42-image.png
❗ 这个情况,没有回调到任何onTouchEvent方法
第三个测试:将ViewGroup的OnInterceptTouchEvent()方法,返回ture ,【 点击View,移动 然后抬起】

1、测试结果:

snipaste_20201123_100123.png

2、过程抽象图:👇

2020-11-23-10-05-14-image.png
❗这个情况,因为点击事件被ViewGroup拦截,所以没有走到View的dispatchTouchEvent 和onTouchEvent事件,View 不参与分发和响应 ,直接通过ViewGroup的onTouchEvent() 回传到Activity去了,而移动和抬起事件,依然直接传到Activity自己的onTouchEvent()。
第四个测试:将View的dispatchTouchEvent返回true,【 点击View,移动 然后抬起】

1、测试结果:

2020-11-23-10-26-09-image.png
2、过程抽象图:👇
2020-11-23-10-28-20-image.png
❗ 这个情况,三个对象都没有回调onTouchEvent()方法
第五个测试:将View的dispatchTouchEvent返回false,【 点击View,移动 然后抬起】

1、测试结果:

2020-11-23-12-05-02-image.png
2、过程抽象图:👇
2020-11-23-10-50-56-image.png
❗ 这个情况View 的 dispatchTouchEvent 不分发,直接回调到ViewGroup 的 onTouchEvent()
第六个测试:将View的onTouchEvent() 返回 true,【 点击View,移动 然后抬起】

1、测试结果:

2020-11-23-12-17-54-image.png
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
上一篇下一篇

猜你喜欢

热点阅读