Android进阶学习之路——View事件的传递机制

原理饶口令:事件阶段两步走、向下分发、向上传递、分发可拦截先分发,后传递,事件消费不传递

事件分发中重要的方法
  1. dispatchTouchEvent                分发事件(只要触摸控件,就会调用控件的DispathTouchEvent方法)
  2. onInterceptTouchEvent           拦截事件
  3. OnTouch                                 View类的抽象方法,让调用者去setOntouchListener的时候实现的方法
  4. onTouchEvent                         View类自己的方法,复写View的时候,自己去覆盖父类的OnTouchEvent方法。

ViewGroup事件分发原理:
  1. 当点击屏幕的时候,获取手指在屏幕上的位置,然后调用当前Activity根布局ViewGroup的dispatchTouchEvent方法。
    1. 判断disallowIntercept(是否禁用掉拦截功能,默认false)或(!oninterceptTouchEvent(ev))为true   (事件拦截):分发阶段
      1. 判断当前手指的点是否位于ViewGroup的子结点上(View或ViewGroup),
        1. 如果是则调用子结点的DisaptchTouchEvent方法                                   (事件向子控件分发):分发阶段

    2. 如果不是则调用自己父类(View)的DisapchTouchEvent方法,自己来消费当前事件,如果自己不消费当前事件,
      则将事件传递至父控件进行处理,如果父控件也不处理,继续向上传递。                               :传递阶段

      代码详解




View的事件分发处理:
  1. 当自己的DisaptchTouchEvent方法被调用的时候
            
            如果OnTouch返回True,那么就不会执行当前类的OnTouchEvent方法了。
        如果当前方法返回true,表示消费掉当前的事件,那么事件也就不会再向上传递了。

  2. OnTouchEvent详解


事件分发有几点需要理清楚的知识点:
  1. 事件分发中的View和ViewGroup区别。ViewGroup仅仅是负责事件分发的,和事件的传递。向子控件分发事件还是被传递从而调用自身(父类)的DispatchToucheEvent方法。 
  2. 触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法
  3. 如果子控件dispatchTouchEvent一直返回false,表示不消费当前的事件,那么之后事件会向上传递。
  4. touch事件的层级传递: 如果在执行ACTION_DOWN时返回false,后面一系列其它的action就不会执行。简单的说:当dispatchTouchEvent时行事件分发的时候,只有前一个Action返回true。才会触发后一个Action。    下面是示意图

            


FLY:以上是自己在学习的过程中所做的笔记,如果有错误的言论或者有没说明白的欢迎评论。咱们共同学习、共同进步


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章