美文网首页
Android 事件分发学习记录

Android 事件分发学习记录

作者: zoustin | 来源:发表于2020-11-23 16:29 被阅读0次

    事件分发的几种流程记录

    分发的大体流程: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

    相关文章

      网友评论

          本文标题:Android 事件分发学习记录

          本文链接:https://www.haomeiwen.com/subject/gklviktx.html